Führen Sie einen Befehl aus und fügen Sie die Ergebnisse in eine Variable ein ... alles in einem Bash-Skript

1036
CamelBlues

Ich arbeite an einem Bash-Skript, das eine Konfigurationsdatei sichert, bevor eine neue Datei kopiert wird.

So sieht mein Ausschnitt aus:

mv ~/myStuff.conf ~/myStuff.conf.bak cp ~/new/myStuff.conf ~/myStuff.conf 

Bei jeder Ausführung dieses Skripts möchte ich, dass das Backup einen Unix-Zeitstempel im Dateinamen hat. Ich habe es versucht

DATEVAR=date +%s mv ~/myStuff.conf ~/myStuff.conf.$DATEVAR.bak 

Dies funktioniert jedoch nicht, da die Date-Funktion nicht ausgeführt wird und Bash dies als String sieht und die resultierende Datei dann endet

myStuff.conf.date+%s.bak 

Ideen, wie die Ergebnisse der Datumsfunktion in eine Variable umgewandelt werden können?

1
Technisch gesehen ist das andere ein Duplikat, da es 3 Jahre älter ist. music2myear vor 7 Jahren 0

3 Antworten auf die Frage

5
Rich Homolka

Dies ist mit der Befehlsersetzung möglich .

DATEVAR=$(date +%s) 
1
Klaas-Z4us-V
--[[z4us|binz--]]  export datevar=`date` # date embedded in backquotes  --[[z4us|binz--]]  echo $datevar  Lun 25 Gen 2016 15:56:14 CET 
Abgesehen von der korrekten Formatierung für Code würde eine Erklärung der Vorgänge diese Antwort verbessern. Nattgew vor 8 Jahren 0
Nun, Nattgew FYI: `export` macht die Variable in der Umgebung für die nächsten Schritte verfügbar. Backquotes umgeben einen Bash-Befehl, der ausgeführt wird. Ich dachte, Superuser sollten diese Grundlagen kennen, aber natürlich müssen wir an Leser denken, die hier über eine Suchmaschine ankommen :-) Klaas-Z4us-V vor 8 Jahren 0
Für `bash` können Sie jede Shell lesen und ich habe den Befehl ohne Parameter verwendet, um zu sehen, was der Standard ist. Klaas-Z4us-V vor 8 Jahren 0
1
Daniel Liston

Dies antwortet nicht auf die Variable, die die Ausgabe eines Befehls enthält. Das ist schon beantwortet. Wie für den Rest Ihres Beispielskripts;

Eine etwas kürzere Version:

mv ~/myStuff.conf ~/myStuff.conf.$(date +%s) 

Sie müssen keine Variable für etwas festlegen, das Sie nur einmal benötigen oder verwenden. Um mit mehr Shells kompatibel zu sein, können Sie auch folgende Syntax verwenden:

mv ~/myStuff.conf ~/myStuff.conf.`date +%s` 

Es scheint mir nur so, dass die Verwendung des Datumsstempels als Erweiterung die zusätzliche .bak-Datei im Dateinamen überflüssig macht.