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.