Buat variabel cap waktu di skrip bash

375

Saya mencoba membuat variabel timestamp dalam skrip shell untuk membuat pencatatan sedikit lebih mudah. Saya ingin membuat variabel di awal skrip dan mencetaknya saat ini setiap kali saya menerbitkan echo $timestamp. Terbukti lebih sulit dari yang saya kira. Inilah beberapa hal yang saya coba:

timestamp="(date +"%T")" cetakan gema (date +"%T")

timestamp="$(date +"%T")" echo mencetak waktu ketika variabel diinisialisasi.

Hal lain yang saya coba hanyalah sedikit variasi yang tidak bekerja lebih baik. Adakah yang tahu bagaimana mencapai apa yang saya coba lakukan?

Dan
sumber

Jawaban:

310

Untuk mendapatkan cap waktu saat ini dan bukan waktu ketika variabel tetap didefinisikan, triknya adalah menggunakan fungsi dan bukan variabel:

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T"
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

Jika Anda tidak menyukai format yang diberikan oleh %Tspecifier, Anda dapat menggabungkan specifier konversi waktu lain yang diterima oleh date. Untuk GNU date, Anda dapat menemukan daftar lengkap penentu dalam dokumentasi resmi di sini: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

giordano
sumber
26
Tergantung pada bagaimana Anda berniat untuk menggunakan ini, Anda masih harus menggunakan substitusi perintah: echo "$(timestamp): something happened".
chepner
5
Mengenai pemformatan, berikut ini adalah seperangkat format yang paling sering dipotong dan dikeringkan: zxq9.com/archives/795
zxq9
175
Bagi saya, saya ingin date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson
3
untuk beberapa alasan ini tidak memberi saya cap waktu tetapi waktu saat ini dengan ":" di antaranya.
erikbwork
7
Saya pikir banyak orang sampai pada pertanyaan ini mencari cara untuk menghasilkan cap waktu unix (seperti yang saya miliki) dan menemukan jawaban oleh dchakarov lebih berguna walaupun jawaban ini lebih baik menjawab pertanyaan si penanya.
vastlysuperiorman
565

Jika Anda ingin mendapatkan cap waktu unix, maka Anda perlu menggunakan:

timestamp=$(date +%s)

%Takan memberi Anda waktu saja; sama dengan %H:%M:%S(via http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )

dchakarov
sumber
5
Tetapi variabel ini hanya akan menyimpan nilai waktu ketika variabel dimulai, apakah saya benar?
lindhe
9
Saya kira ini mendapatkan banyak upvotes karena menjawab judul pertanyaan, tetapi tidak menjawab tubuh pertanyaan: D OP ingin mendapatkan cap waktu yang berbeda setiap kali, sedangkan ini akan menyimpan satu untuk seluruh skrip.
fedorqui 'SO berhenti merugikan'
1
Saya datang ke sini untuk mencari ini tepatnya. Yaitu format string yang tepat untuk mendapatkan cap waktu unix dari date. Namun, saya juga mengangkat jawaban yang "benar". Saya tidak mencari itu, tapi itu jawaban yang lebih baik untuk pertanyaan asli dan juga sangat berguna bagi saya.
farlysuperiorman
69
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
Girdhar Singh Rathore
sumber
1
terima kasih, itulah yang saya inginkan: cap waktu sebagai variabel untuk digunakan kembali dalam skrip saya! Sintaks shell sangat membingungkan.
Poutrathor
2
+1 untuk menambahkan bagian milidetik. echo $(date +"%Y-%m-%dT%T.%3N%z") Namun ini saya tidak bisa berfungsi di terminal Mac. Cara melakukan hal yang sama di Mac. Terima kasih
kosgeinsky
43

Format ISO 8601 ( 2018-12-23T12:34:56) lebih mudah dibaca daripada cap waktu UNIX. Namun pada beberapa OS Anda tidak dapat memiliki :dalam nama file. Karena itu saya sarankan menggunakan sesuatu seperti ini sebagai gantinya:

2018-12-23_12-34-56

Anda dapat menggunakan perintah berikut untuk mendapatkan cap waktu dalam format ini:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

Ini adalah format yang saya lihat digunakan banyak aplikasi. Satu hal yang menyenangkan tentang ini adalah bahwa jika nama file Anda mulai dengan ini, Anda dapat mengurutkannya berdasarkan abjad dan akan diurutkan berdasarkan tanggal.

Caner
sumber
1
Terima kasih ini bagus untuk script kontrol versi saya
Andy
1
TZ=UTC date +...dapat menjadikan ini lebih portabel dengan menggunakan stempel waktu UTC
MichaelChirico
17

Saya menggunakan ubuntu 14.04.

Seharusnya cara yang benar dalam sistem saya date +%s.

Outputnya date +%Tseperti 12:25:25.

Sean Lin
sumber
15

Gunakan substitusi perintah:

timestamp=$( date +%T )
choroba
sumber
3
Ini adalah apa yang sudah saya coba dan hanya mencetak waktu ketika variabel diinisialisasi.
Dan
10
@ dan08: Begitulah cara kerja variabel. Gunakan fungsi jika Anda ingin output dinamis.
choroba
11

Kamu bisa menggunakan

timestamp=`date --rfc-3339=seconds`

Ini memberikan dalam format 2014-02-01 15:12:35-05:00

Karakter back-tick ( `) akan menyebabkan apa yang ada di antara mereka dievaluasi dan hasilnya dimasukkan dalam baris. date --helpmemiliki opsi lain.

Tagihan
sumber
1
Adapun waktu yang didapat, ini harus dieksekusi segera sebelum dimasukkan dalam output layar atau file log yang dimaksudkan untuk memiliki waktu output terdaftar.
Tagihan
2
ini kurang dari format ideal untuk cap waktu karena ruang dalam output. Pastikan untuk mengutipnya "$ timestamp" dalam penggunaan atau Anda akan mendapatkan dua params ke perintah. misal touch $timestampakan menghasilkan dua file.
harschware
8

Versi terbaru dari bashtidak memerlukan panggilan ke program eksternal date:

printf -v timestamp '%(%T)T'

%(...)Tmenggunakan argumen yang sesuai sebagai cap waktu UNIX, dan memformatnya sesuai dengan strftimeformat-style di antara tanda kurung. Argumen -1korespondensi dengan waktu saat ini, dan ketika tidak ada ambiguitas yang terjadi dapat dihilangkan.

chepner
sumber
5

Dan untuk sesama orang Eropa, coba gunakan ini:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

akan memberikan format format: "15-02-2020_19-21-58"

Anda memanggil variabel dan mendapatkan representasi string seperti ini

$timestamp
Christoffer Nissen
sumber
1
Harap pertimbangkan untuk menggunakan notasi kode untuk kode Anda.
sao
4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand tanpa nilai menggunakan cap waktu saat ini dengan sebagian besar implementasi Awk.

Steven Penny
sumber
Saya suka yang ini, sangat kreatif!
TobiV