Bagaimana memformat keluaran tanggal dengan spasi sebagai variabel dalam skrip?

13

Saya ingin membuat dateperintah dengan format yang bagus seperti ini:

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

Tapi saya ingin menyimpan ini dalam variabel, jadi saya bisa menelepon dari skrip seperti ini: echo "$(nice_date) [WARNING] etc etc"

Namun itu tidak berhasil

$ 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.

Apa cara yang benar untuk melakukan ini, sehingga perintah tanggal untuk mendapatkan satu argumen yang benar?

gilbertasm
sumber
Sebagai catatan tambahan, string format tanggal Anda dapat disingkat menjadi "%F %T"jika Anda menggunakan GNU date.
jordanm
Masalahnya adalah ruang. Jika Anda menggunakan nice_date="date +%Y-%m-%d-%H:%M:%S", itu berfungsi. Saat ini saya tidak bisa melihat bagaimana cara mendapatkan ruang yang terlindung dari shell kedua.
MadHatter

Jawaban:

13

Alasan contoh Anda gagal adalah karena cara pemecahan kata shell bekerja. Ketika Anda menjalankan "$($nice_date)", shell mengeksekusi dateperintah dengan dua argumen, "+%Y-%m-%d"dan "%H:%M:%S". Ini gagal karena string format untuk tanggal harus berupa argumen tunggal.

Cara terbaik untuk melakukan ini adalah dengan menggunakan fungsi alih-alih menyimpan perintah dalam variabel:

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"

Jika Anda benar-benar ingin menyimpan perintah dalam variabel, Anda bisa menggunakan array:

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

Untuk detail lebih lanjut tentang kasus kompleks menyimpan perintah dalam variabel, lihat BashFAQ 050 .

jordanm
sumber
Terima kasih, tetapi saya ingin tahu mengapa pendekatan saya tidak berhasil, dapatkah Anda menjelaskannya?
gilbertasm
@gilbertasm jawab diperbarui
jordanm
1
Saya mendapatkan date: extra operand ‘’kesalahan dengan kedua pendekatan di atas
Jeff Puckett
3

Saya setuju fungsi adalah cara terbaik untuk pergi. Sebagai alternatif, cukup simpan format sebagai variabel daripada seluruh perintah:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"
Adam
sumber
1
@ Kusalananda: Benar sekali. Terima kasih! Telah memperbarui jawabannya
Adam
Dan, um, maaf, tapi echoperintah dan substitusi juga berlebihan.
Kusalananda
1
Ya, mereka secara teknis berlebihan dalam contoh cut-down yang saya gunakan (saya bisa berpendapat mereka menghasilkan kode yang lebih mudah dibaca tapi itu masalah selera). Telah diperbarui untuk menggunakan contoh dari OP, dalam hal ini mereka diperlukan
Adam
Ya, contoh itu lebih masuk akal.
Kusalananda
1

Jawaban terpendek adalah

#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'
Trung Thanh
sumber
1

Salah satu cara mudah adalah dengan hanya 'melarikan diri' dari ruang dengan \

nice_date="date +%Y-%m-%d\ %H:%M:%S"
pengguna381580
sumber
0

Silakan coba di bawah ini:

Anda perlu menambahkan simbol "` "simbol yang ada pada tombol tilde di keyboard. Simbol mengatakan shell untuk menjalankan perintah pertama dan kemudian menetapkan ke variabel.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#
ZVIK
sumber
Masalah yang sama dengan jawaban Iain.
MadHatter
0

Dari pada:

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

Mencoba:

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

Selain itu, Anda tidak perlu penggantian perintah terakhir:

date "$nice_date_format"
pengguna1333144
sumber
-1

Punya masalah yang sama; harus memasukkan tanggal ke cetakan awk untuk diproses oleh splunk. Saya menggunakan

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

DATE2=`date +%T`

kemudian

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc
Mike Fester
sumber
1
Bisakah Anda menjelaskan dengan tepat bagaimana ini menjawab pertanyaan?
G-Man Mengatakan 'Reinstate Monica'