Как построить правильную командную строку в Bash? Цитируя вопросы, я думаю

281
user127236

У меня вопрос очень новичка, я уверен. Я пытаюсь создать сценарий для редактирования внутренних временных меток EXIF ​​ряда файлов фотографий JPG, используя утилиту командной строки exiftool. Моя настоящая проблема заключается в создании командной строки.

Мне нужно, чтобы команда, выполняемая скриптом, выглядела следующим образом:

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

Соответствующая часть моего сценария:

# 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 

Тем не менее, опция set -x в моем скрипте показывает, что выполняется

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

Дополнительные символы одинарных кавычек вставляются в параметр DateTimeOriginal, и я не понимаю, почему и как.

Заранее благодарим за любую оказанную помощь.

JGB

1
Использование двойных кавычек, а не одинарных (и экранирование двойных кавычек, которые вам * нужны *) - это шаг в правильном направлении. Thomas Dickey 8 лет назад 1
Ответ на эту проблему подробно описан здесь: http://mywiki.wooledge.org/BashFAQ/050 - краткий ответ: вы не можете сделать это с умным цитированием, вы должны использовать массивы bash. glenn jackman 8 лет назад 1
Я согласен с Томасом Дики. Подстановка и расширение строк не происходит в строках с одинарными кавычками. Возможно, вам придется попробовать что-то вроде этого, вместо этого: EXOPTION = "- overwrite_original_in_place -DateTimeOriginal = \" $ TIMESTAMP \ "" Rob Szumlakowski 8 лет назад 0

1 ответ на вопрос

0
Gombai Sándor

You should not be afraid what set -x shows you. It just indicates where word boundaries and white spaces are found in it's own way but that is no what your command will be when called.

Nevertheless you should consider writing your expressions a bit simpler for the clear picture. For example:

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

Похожие вопросы