Wie formatiere ich die Datumsausgabe mit Leerzeichen als Variable im Skript?

13

Ich möchte den dateBefehl mit einer netten Formatierung wie folgt ausführen:

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

Ich möchte dies jedoch in einer Variablen speichern, sodass ich das Skript folgendermaßen aufrufen kann: echo "$(nice_date) [WARNING] etc etc"

Es funktioniert jedoch nicht

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

Was ist der richtige Weg, um dies zu tun, damit dieser Datumsbefehl ein korrektes Argument erhält?

Gilbertasm
quelle
Als Randnotiz kann Ihre Datumsformat-Zeichenfolge auf abgekürzt werden, "%F %T"wenn Sie GNU verwenden date.
Jordanien
Das Problem ist der Raum. Wenn Sie verwenden nice_date="date +%Y-%m-%d-%H:%M:%S", funktioniert es. Ich kann momentan nicht sehen, wie ich diesen Raum vor der zweiten Shell schützen kann.
MadHatter

Antworten:

13

Der Grund, warum Ihr Beispiel fehlschlägt, ist die Art und Weise, wie die Wortteilung der Shell funktioniert. Wenn Sie ausführen "$($nice_date)", führt die Shell den dateBefehl mit zwei Argumenten "+%Y-%m-%d"und aus "%H:%M:%S". Dies schlägt fehl, da die Formatzeichenfolge für Datum ein einzelnes Argument sein muss.

Am besten verwenden Sie dazu eine Funktion, anstatt den Befehl in einer Variablen zu speichern:

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"

Wenn Sie den Befehl wirklich in einer Variablen speichern möchten, können Sie ein Array verwenden:

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

Weitere Informationen zu den komplexen Fällen des Speicherns eines Befehls in einer Variablen finden Sie in BashFAQ 050 .

Jordanien
quelle
Vielen Dank, aber ich bin gespannt, warum mein Ansatz nicht funktioniert. Können Sie das näher erläutern?
Gilbertasm
@ Gilbertasm Antwort aktualisiert
Jordan
1
Ich erhalte date: extra operand ‘’Fehler mit beiden Ansätzen oben
Jeff Puckett
3

Ich stimme zu, dass eine Funktion der beste Weg ist. Alternativ kann das Format auch als Variable und nicht als gesamter Befehl gespeichert werden:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"
Adam
quelle
1
@ Kusalananda: Ganz richtig. Vielen Dank! Haben die Antwort aktualisiert
Adam
Tut mir leid, aber die echound die Befehlsersetzung sind auch überflüssig.
Kusalananda
1
Ja, sie waren in dem von mir verwendeten Beispiel technisch überflüssig (ich könnte behaupten, sie produzieren besser lesbaren Code, aber das ist eine Frage des Geschmacks). Haben aktualisiert, um das Beispiel aus dem OP zu verwenden, in welchem ​​Fall sie benötigt werden
Adam
Ja, dieses Beispiel macht mehr Sinn.
Kusalananda
1

Kürzeste Antwort ist

#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'
Thanh Trung
quelle
1

Eine einfache Möglichkeit besteht darin, dem Raum mit einem \

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

Bitte probieren Sie das Folgende aus:

Sie müssen das Symbol "` "hinzufügen, das sich auf der Tilde-Taste der Tastatur befindet. Das Symbol weist die Shell an, zuerst den Befehl auszuführen und dann der Variablen zuzuweisen.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#
ZVIK
quelle
Gleiches Problem wie Iains Antwort.
MadHatter
0

Anstatt von:

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

Versuchen:

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

Außerdem benötigen Sie nicht die letzte Befehlsersetzung:

date "$nice_date_format"
user1333144
quelle
-1

Hatte das gleiche Problem; musste ein Datum in einen awk-Abdruck stecken, damit es von splunk verarbeitet werden konnte. ich benutzte

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

DATE2=`date +%T`

dann

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc
Mike Fester
quelle
1
Können Sie genau erklären, wie dies die Frage beantwortet?
G-Man sagt, dass Monica