Créer une variable d'horodatage dans le script bash

375

J'essaie de créer une variable d'horodatage dans un script shell pour rendre la journalisation un peu plus facile. Je veux créer la variable au début du script et la faire imprimer l'heure actuelle à chaque émission echo $timestamp. Cela s'est avéré plus difficile que je ne le pensais. Voici quelques choses que j'ai essayées:

timestamp="(date +"%T")" écho imprime (date +"%T")

timestamp="$(date +"%T")" echo affiche l'heure à laquelle la variable a été initialisée.

D'autres choses que j'ai essayées ne sont que de légères variations qui n'ont pas fonctionné mieux. Quelqu'un sait-il comment accomplir ce que j'essaie de faire?

Dan
la source

Réponses:

310

Afin d'obtenir l'horodatage actuel et non le moment où une variable fixe est définie, l'astuce consiste à utiliser une fonction et non une variable:

#!/bin/bash

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

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

Si vous n'aimez pas le format donné par le %Tspécificateur, vous pouvez combiner les autres spécificateurs de conversion de temps acceptés par date. Pour GNU date, vous pouvez trouver la liste complète de ces spécificateurs dans la documentation officielle ici: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

giordano
la source
26
Selon la façon dont vous avez l' intention d'utiliser, vous aurez toujours besoin d'utiliser la substitution de commande: echo "$(timestamp): something happened".
chepner
5
En ce qui concerne le formatage, voici un ensemble de formats les plus fréquents: zxq9.com/archives/795
zxq9
175
Pour moi, je voulais date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson
3
pour une raison quelconque, cela ne m'a pas donné l'horodatage mais l'heure actuelle avec ":" entre les deux.
erikbwork
7
Je pense que beaucoup de gens arrivent à cette question à la recherche d'un moyen de générer un horodatage Unix (comme je l'ai) et trouvent la réponse de dchakarov plus utile même si cette réponse répond mieux à la question du demandeur.
vastlysuperiorman
565

Si vous souhaitez obtenir l'horodatage Unix, vous devez utiliser:

timestamp=$(date +%s)

%Tvous donnera juste le temps; Identique à %H:%M:%S(via http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )

dchakarov
la source
5
Mais cette variable contiendra juste la valeur du moment où la variable a été lancée, ai-je raison?
lindhe
9
Je suppose que cela reçoit beaucoup de votes positifs car il répond au titre de la question, mais il ne répond pas au corps de la question: D OP voulait obtenir un horodatage différent à chaque fois, alors que cela en stockera un pour tout le script.
fedorqui 'SO arrêtez de nuire'
1
Je suis venu ici à la recherche de cela exactement. C'est-à-dire la chaîne de format appropriée pour obtenir un horodatage Unix date. Cependant, j'ai également voté pour la "bonne" réponse. Je ne cherchais pas cela, mais c'est une meilleure réponse à la question d'origine et c'est aussi très utile pour moi.
vastlysuperiorman
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
la source
1
merci, c'est ce que je voulais: un horodatage comme variable à réutiliser dans mon script! La syntaxe du shell est tellement déroutante.
Poutrathor
2
+1 pour ajouter la partie en millisecondes. Ce que echo $(date +"%Y-%m-%dT%T.%3N%z") je ne peut cependant pas faire fonctionner dans un terminal Mac. Comment faire de même sur Mac. Merci
kosgeinsky
43

Le format ISO 8601 ( 2018-12-23T12:34:56) est plus lisible que l'horodatage UNIX. Cependant, sur certains systèmes d'exploitation, vous ne pouvez pas avoir :de noms de fichiers. Par conséquent, je recommande d'utiliser quelque chose comme ceci à la place:

2018-12-23_12-34-56

Vous pouvez utiliser la commande suivante pour obtenir l'horodatage dans ce format:

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

C'est le format que j'ai vu utiliser par de nombreuses applications. Une autre bonne chose à ce sujet est que si vos noms de fichiers commencent par cela, vous pouvez les trier par ordre alphabétique et ils seront triés par date.

Caner
la source
1
Merci c'est génial pour mon script de contrôle de version
Andy
1
TZ=UTC date +...peut rendre cela plus portable en utilisant l'horodatage UTC
MichaelChirico
17

J'utilise ubuntu 14.04.

La bonne façon dans mon système devrait être date +%s.

La sortie de date +%Test comme 12:25:25.

Sean Lin
la source
15

Utilisez la substitution de commande:

timestamp=$( date +%T )
choroba
la source
3
C'est ce que j'ai déjà essayé et cela n'imprime que l'heure à laquelle la variable a été initialisée.
Dan
10
@ dan08: C'est ainsi que fonctionnent les variables. Utilisez une fonction si vous souhaitez une sortie dynamique.
choroba
11

Vous pouvez utiliser

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

Cela livre dans le format 2014-02-01 15:12:35-05:00

Les caractères back-tick ( `) feront évaluer ce qui est entre eux et le résultat sera inclus dans la ligne. date --helpa d'autres options.

Facture
la source
1
Quant à l'heure, il doit être exécuté immédiatement avant l'inclusion dans la sortie d'écran ou un fichier journal destiné à avoir l'heure de la sortie répertoriée.
Bill
2
c'est moins que le format idéal pour un horodatage en raison de l'espace dans la sortie. Assurez-vous de le citer "$ timestamp" dans l'utilisation ou vous obtiendrez deux paramètres à la commande. eg touch $timestampproduira deux fichiers.
harschware
8

Les versions récentes de bashne nécessitent pas d'appel au programme externe date:

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

%(...)Tutilise l'argument correspondant comme horodatage UNIX et le formate selon le strftimeformat -style entre les parenthèses. Un argument de -1correspond à l'heure actuelle et lorsqu'aucune ambiguïté ne se produit, il peut être omis.

chepner
la source
5

Et pour mes collègues européens, essayez d'utiliser ceci:

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

donnera un format du format: "15-02-2020_19-21-58"

Vous appelez la variable et obtenez la représentation de chaîne comme ceci

$timestamp
Christoffer Nissen
la source
1
Veuillez envisager d'utiliser la notation de code pour votre code.
sao
4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand sans valeur utilise l'horodatage actuel avec la plupart des implémentations Awk.

Steven Penny
la source
J'aime celui-ci, très créatif!
TobiV