Tarih çıktısını komut dosyasında değişken olarak boşluklarla nasıl biçimlendirebilirim?


13

Ben dateböyle güzel biçimlendirme ile komut yapmak istiyorum:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

Ama bu değişkeni kaydetmek istiyorum, bu yüzden böyle bir komut dosyasından çağırabilirsiniz: echo "$(nice_date) [WARNING] etc etc"

Ancak çalışmıyor

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"
Try 'date --help' for more information.

Bunu yapmanın doğru yolu nedir, böylece tarih komutu bir doğru argüman almak için?


Yan not olarak, "%F %T"GNU kullanıyorsanız tarih biçimi dizeniz kısaltılabilir date.
jordanm

Sorun alan. Eğer kullanırsanız nice_date="date +%Y-%m-%d-%H:%M:%S"çalışır. Şu anda bu alanın ikinci kabuktan nasıl korunacağını göremiyorum.
MadHatter

Yanıtlar:


13

Örneğinizin başarısız olmasının nedeni, kabuğun kelime bölünmesinin çalışma biçimidir. Çalıştırdığınızda "$($nice_date)", kabuk datekomutu iki bağımsız değişkenle "+%Y-%m-%d"ve "%H:%M:%S". Tarih biçim dizesinin tek bir bağımsız değişken olması gerektiğinden bu başarısız olur.

Bunu yapmanın en iyi yolu, komutu bir değişkende saklamak yerine bir işlev kullanmaktır:

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

Komutu gerçekten bir değişkende saklamak istiyorsanız, bir dizi kullanabilirsiniz:

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

Komutun bir değişkende saklanmasıyla ilgili karmaşık durumlar hakkında daha fazla bilgi için bkz. BashFAQ 050 .


Teşekkür ederim, ama yaklaşımımın neden işe yaramadığını merak ediyorum, bunun hakkında ayrıntılı bilgi verebilir misiniz?
gilbertasm

@gilbertasm cevap güncellendi
jordanm

1
date: extra operand ‘’Yukarıdaki her iki yaklaşımla da hata alıyorum
Jeff Puckett

3

Ben bir fonksiyon gitmek için en iyi yol olduğunu kabul ediyorum. Alternatif olarak, biçimi tüm komut yerine bir değişken olarak depolayın:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@Kusalananda: Çok doğru. Teşekkür ederim! Cevabı güncelledik
Adam

Ve, um, üzgünüm, ama echove komut ikamesi de gereksizdir.
Kusalananda

1
Evet, kullandığım kesim örneğinde teknik olarak gereksizdi (daha okunabilir kod ürettiklerini iddia edebilirim ama bu bir zevk meselesi). OP örneğini kullanmak için güncellendi, bu durumda gerekli
Adam

Evet, bu örnek daha mantıklı.
Kusalananda

1

En kısa cevap

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'


0

Lütfen aşağıdakileri deneyin:

Klavyedeki tilde tuşunun üzerindeki sembolü "" "sembolüne eklemeniz gerekir. Sembol, kabuğun önce komutu yürütmesini ve sonra değişkene atamasını söyler.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

Iain'nin cevabı ile aynı problem.
MadHatter

0

Onun yerine:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

Deneyin:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

Ayrıca, son komut değişikliğine ihtiyacınız yoktur:

date "$nice_date_format"

-1

Aynı sorun vardı; splunk tarafından işlenmek için bir tarih baskısı koymak zorunda kaldı. kullandım

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

sonra

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
Bunun soruyu tam olarak nasıl cevapladığını açıklayabilir misiniz?
G-Man
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.