2013-06-12 24 views
225

Sto cercando di creare una variabile timestamp in uno script di shell per rendere la registrazione un po 'più semplice. Voglio creare la variabile all'inizio dello script e farla stampare l'ora corrente ogni volta che rilascio il numero echo $timestamp. Si sta dimostrando più difficile di quanto pensassi. Qui ci sono alcune cose che ho provato:Crea variabile timestamp in script bash

timestamp="(date +"%T")" stampe eco fuori (date +"%T")

timestamp="$(date +"%T")" eco stampa il momento in cui è stato inizializzato la variabile.

Altre cose che ho provato sono solo lievi variazioni che non hanno funzionato meglio. Qualcuno sa come realizzare ciò che sto cercando di fare?

risposta

185

Al fine di ottenere il timestamp corrente e non il momento di quando viene definita una variabile fisso, il trucco è quello di utilizzare una funzione e non una variabile:

#!/bin/bash 

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

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

Se non ti piace il formato proposta dal %T specificatore è possibile combinare gli altri indicatori di conversione in tempo accettate da date. Per GNU date, è possibile trovare l'elenco completo di questi specificatori nella documentazione ufficiale qui: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

+17

A seconda di come intendi usarlo, dovrai comunque utilizzare la sostituzione di comando: "echo" $ (timestamp): è successo qualcosa "'. – chepner

+4

Per quanto riguarda la formattazione, ecco un insieme di formati più frequenti: http: // zxq9.com/archives/795 – zxq9

+91

Per me, volevo 'date +"% Y-% m-% d_% H-% M-% S "' –

11

Uso sostituzione di comando:

timestamp=$(date +%T) 
+3

Questo è quello che ho già provato e stampa solo l'ora in cui la variabile è stata inizializzata. – dan08

+8

@ dan08: Ecco come funzionano le variabili. Utilizzare una funzione se si desidera l'output dinamico. – choroba

361

Se si desidera ottenere unix timestamp, quindi è necessario utilizzare:

timestamp=$(date +%s) 

%T vi darà solo il tempo; stessa %H:%M:%S (via http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/)

+4

Ma questa variabile manterrà solo il valore del tempo in cui è stata avviata la variabile, ho ragione? – lindhe

+3

Immagino che questo stia ottenendo molti upvotes perché risponde al titolo della domanda, ma non sta rispondendo al corpo della domanda: D OP voleva ottenere un timestamp diverso ogni volta, mentre questo ne memorizzerebbe uno per l'intero script. – fedorqui

7

È possibile utilizzare

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

Ciò garantisce nel formato 2014-02-01 15:12:35-05:00

Il back-tick (`) personaggi causeranno ciò che è tra di loro da valutare ed avere il risultato incluso nella linea. date --help ha altre opzioni.

+1

Per quanto riguarda l'ora, questa dovrebbe essere eseguita immediatamente prima dell'inclusione nell'output dello schermo o in un file di registro che desideri avere il tempo dell'output elencato. – Bill

+2

questo è il formato meno ideale per un timestamp a causa dello spazio nell'output. Assicurati di citare "$ timestamp" in uso o otterrai due parametri per il comando. per esempio. 'touch $ timestamp' produrrà due file. – harschware

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

srand senza un valore utilizza il timestamp corrente con la maggior parte delle implementazioni di Awk.

+0

perché non usare il semplice comando '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

Sto usando ubuntu 14.04.

Il modo corretto nel mio sistema deve essere date +%s.

L'uscita di date +%T è come 12:25:25.

Problemi correlati