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?


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 .


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"

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'

1

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

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

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 ~]#

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"

-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

1
Bisakah Anda menjelaskan dengan tepat bagaimana ini menjawab pertanyaan?
G-Man Mengatakan 'Reinstate Monica'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.