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.