Wie erstelle ich einen richtigen Befehl in bash? Zitatfragen, denke ich

332
user127236

Ich habe eine sehr neue Frage, da bin ich mir sicher. Ich versuche, ein Skript zum Bearbeiten der internen EXIF-Zeitstempel einer Reihe von JPG-Fotodateien mithilfe des Befehlszeilen-Dienstprogramms exiftool zu erstellen. Mein eigentliches Problem besteht im Aufbau der Befehlszeichenfolge.

Der Befehl, der vom Skript ausgeführt wird, muss folgendermaßen aussehen:

exiftool -overwrite_original_in_place -DateTimeOriginal="2015:12:29 08:00:00" filename.jpg 

Der relevante Teil meines Skripts ist:

# compute timestamp TIMESTAMP="2015:12:29 `printf %02d $HOUR`:`printf %02d $MIN`:`printf %02d $SEC`" # Set options string for exiftool EXOPTION='-overwrite_original_in_place -DateTimeOriginal="'$TIMESTAMP'"' # Execute exiftool on the current file exiftool $EXOPTION $f 

Die set -x- Option in meinem Skript zeigt jedoch an, dass das ausgeführt wird

exiftool -overwrite_original_in_place '-DateTimeOriginal="2015:12:29' '08:00:00"' filename.jpg 

Zusätzliche einfache Anführungszeichen werden in die DateTimeOriginal- Option eingefügt, und ich verstehe nicht, warum oder wie.

Vielen Dank im Voraus für die geleistete Hilfe.

JGB

1
Die Verwendung von Anführungszeichen anstelle von einfachen Anführungszeichen (und die doppelten Anführungszeichen, die Sie * benötigen *), ist ein Schritt in die richtige Richtung. Thomas Dickey vor 8 Jahren 1
Dieses Problem wird hier ausführlich beantwortet: http://mywiki.wooledge.org/BashFAQ/050 - kurze Antwort: Sie können es nicht mit geschickten Zitaten tun, Sie müssen Bash-Arrays verwenden. glenn jackman vor 8 Jahren 1
Ich stimme mit Thomas Dickey überein. Zeichenfolgenersetzung und -erweiterung erfolgt nicht in Zeichenfolgen mit einfachen Anführungszeichen. Möglicherweise müssen Sie Folgendes versuchen: EXOPTION = "- overwrite_original_in_place -DateTimeOriginal = \" $ TIMESTAMP \ "" " Rob Szumlakowski vor 8 Jahren 0

1 Antwort auf die Frage

0
Gombai Sándor

Sie sollten keine Angst haben, was Set -x Ihnen zeigt. Es zeigt lediglich an, wo sich Wortgrenzen und Leerzeichen auf eigene Weise befinden, aber dies ist nicht das, was Ihr Befehl sein wird, wenn er aufgerufen wird.

Trotzdem sollten Sie in Betracht ziehen, Ihre Ausdrücke für das klare Bild etwas einfacher zu schreiben. Zum Beispiel:

TIMESTAMP=`printf '2015:12:29 %02d:%02d:%02d' $HOUR $MIN $SEC` EXOPTION="-overwrite_original_in_place -DateTimeOriginal=\"$TIMESTAMP\""