2013-06-12 23 views
225

Próbuję utworzyć zmienną znacznika czasu w skrypcie powłoki, aby rejestrowanie było łatwiejsze. Chcę utworzyć zmienną na początku skryptu i zlecić wydruk bieżącego czasu, kiedy wydaję echo $timestamp. To okazało się trudniejsze niż myślałem. Oto kilka rzeczy, próbowałem:Utwórz zmienną znacznika czasu w skrypcie bash

timestamp="(date +"%T")" drukuje echo spośród (date +"%T")

timestamp="$(date +"%T")" echo drukuje czas, gdy zmienna została zainicjowana.

Inne rzeczy, których próbowałem, to tylko niewielkie odmiany, które nie działały lepiej. Czy ktoś wie, jak osiągnąć to, co próbuję zrobić?

Odpowiedz

185

W celu uzyskania aktualnego znacznika czasu, a nie czas, gdy zmienna określa się stałą, sztuką jest wykorzystanie funkcji i nie zmienna:

#!/bin/bash 

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

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

Jeśli nie podoba ci się format określony przez specyfikator %T, możesz łączyć inne specyfikatory konwersji czasu zaakceptowane przez date. Dla GNU date można znaleźć pełną listę tych specyfikatorami w oficjalnej dokumentacji tutaj: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

+17

W zależności od tego, w jaki sposób zamierzasz korzystać z tego, będziesz musiał użyć podstawienia komend: 'echo" $ (znacznik czasu): coś się stało "'. – chepner

+4

Jeśli chodzi o formatowanie, tutaj jest wycięty i wysuszony zestaw najczęściej używanych formatów: http: // zxq9.com/archives/795 – zxq9

+91

Dla mnie chciałem "date +"% Y-% m-% d_% H-% M-% S "' –

11

Użyj polecenia podstawienie:

timestamp=$(date +%T) 
+3

To jest to, co już wypróbowałem i wyświetla tylko czas zainicjowania zmiennej. – dan08

+8

@ dan08: Tak działają zmienne. Użyj funkcji, jeśli chcesz uzyskać dynamiczne wydruki. – choroba

361

Jeśli chcesz uzyskać uniksowy znacznik czasu, to trzeba użyć:

timestamp=$(date +%s) 

%T daje tylko czas; tak samo jak %H:%M:%S (przez http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/)

+4

Ale ta zmienna będzie po prostu zawierać wartość czasu, w którym zmienna została zainicjowana, czy mam rację? – lindhe

+3

Podejrzewam, że jest to bardzo dużo, ponieważ odpowiada na tytuł pytania, ale nie odpowiada na pytanie: D OP chciał uzyskać inny znacznik czasu za każdym razem, podczas gdy to będzie przechowywać dla całego skryptu. – fedorqui

7

Można użyć

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

ten dostarcza w formacie 2014-02-01 15:12:35-05:00

Back-tick (`) znaków spowoduje to, co jest między nimi, aby być oceniane i mają wynik zawarty w linii. date --help ma inne opcje.

+1

Co do tego, o której godzinie to nastąpi, powinno to być wykonane natychmiast przed włączeniem do wyjścia ekranu lub pliku dziennika przeznaczonego na czas wyjścia. – Bill

+2

jest to mniejszy niż idealny format dla znacznika czasu z powodu spacji na wyjściu. Upewnij się, że cytujesz "$ timestamp" w użyciu lub otrzymasz dwa parametry do polecenia. na przykład 'touch $ timestamp' wyświetli dwa pliki. – harschware

1
timestamp=$(awk 'BEGIN {srand(); print srand()}') 

srand bez wartości używa bieżącego znacznika czasu z większości implementacji awk.

+0

dlaczego nie użyć prostego polecenia 'date'? – caesarsol

22
DATE=`date "+%Y%m%d"` 

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too 
2

Używam ubuntu 14.04.

Poprawny sposób w moim systemie powinien być date +%s.

Dane wyjściowe date +%T są podobne do 12:25:25.

Powiązane problemy