Come formattare l'output della data con spazi come variabile nello script?


13

Voglio fare il datecomando con una bella formattazione come questa:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

Ma voglio salvarlo in una variabile, in modo da poter chiamare dallo script in questo modo: echo "$(nice_date) [WARNING] etc etc"

Comunque, non funziona

$ 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.

Qual è il modo corretto per farlo, quindi quel comando date per ottenere un argomento corretto?


Come nota a margine, la stringa del formato della data può essere abbreviata "%F %T"se si utilizza GNU date.
Giordania,

Il problema è lo spazio. Se usi nice_date="date +%Y-%m-%d-%H:%M:%S", funziona. Al momento non riesco a vedere come proteggere quello spazio dalla seconda shell.
MadHatter,

Risposte:


13

Il motivo per cui l'esempio ha esito negativo è dovuto al modo in cui funziona la suddivisione delle parole della shell. Quando si esegue "$($nice_date)", la shell esegue il datecomando con due argomenti "+%Y-%m-%d"e "%H:%M:%S". Ciò non riesce perché la stringa di formato per la data deve essere un singolo argomento.

Il modo migliore per farlo è usare una funzione invece di memorizzare il comando in una variabile:

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"

Se si desidera veramente archiviare il comando in una variabile, è possibile utilizzare un array:

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

Per maggiori dettagli sui casi complessi di memorizzazione di un comando in una variabile, vedere BashFAQ 050 .


Grazie, ma sono curioso di sapere perché il mio approccio non funziona, puoi approfondirlo?
Gilbertasm,

@gilbertasm risposta aggiornata
jordanm

1
Ricevo date: extra operand ‘’errori con entrambi gli approcci sopra
Jeff Puckett,

3

Sono d'accordo che una funzione è il modo migliore per andare. In alternativa, è sufficiente archiviare il formato come variabile anziché come intero comando:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@Kusalananda: Esatto. Grazie! Ho aggiornato la risposta
Adam,

E, um, scusa, ma anche la echosostituzione del comando e sono superflui.
Kusalananda

1
Sì, erano tecnicamente superflui nell'esempio ridotto che ho usato (potrei sostenere che producono un codice più leggibile ma è una questione di gusti). Si sono aggiornati per usare l'esempio dell'OP, nel qual caso sono necessari
Adam,

Sì, quell'esempio ha più senso.
Kusalananda

1

La risposta più breve è

#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

Un modo semplice è semplicemente "sfuggire" allo spazio con un \

nice_date="date +%Y-%m-%d\ %H:%M:%S"

0

Si prega di provare quanto segue:

È necessario aggiungere il simbolo "` "il simbolo che si trova sul tasto Tilde nella tastiera. Il simbolo indica alla shell di eseguire prima il comando e quindi assegnare alla variabile.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

Stesso problema della risposta di Iain.
MadHatter,

0

Invece di:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

Provare:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

Inoltre, non è necessaria l'ultima sostituzione del comando:

date "$nice_date_format"

-1

Aveva lo stesso problema; ho dovuto mettere una data in una stampa awk per l'elaborazione da parte di Splunk. ero solito

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

poi

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
Puoi spiegare esattamente come questo risponde alla domanda?
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.