Как заставить Bash использовать * подстановочный знак в команде?

Я создал сценарий удара для автоматизации редактирования данных EXIF в файлах изображений. Я не могу выяснить, как заставить сценарий давать команду с * подстановочный знак (звездочка) для определения шаблона имени файла.

Сценарий правильно собирает команду CLI, которая выполняется правильно, если я ввожу его вручную за пределами сценария удара. Но из удара, сценарий возвращает файл, не найденный ошибкой.

Вот мой код:

#!/bin/bash

# Usage: Place this script in the directory of jpg files whose EXIF data is to be edited.

echo Press enter to accept default values.

# Enter camera manufacturer.
default="Pentax"
read -p "Enter camera manufacturer [$default]: " cameramake
cameramake=${cameramake:-$default}
exifargs="-model=$cameramake"

# Enter camera model.
default="K1000"
read -p "Enter camera model [$default]: " cameramodel
cameramodel=${cameramodel:-$default}
exifargs="$exifargs -make=$cameramodel"

# Enter slide film type.
default="Kodachrome slide film."
read -p "Enter slide film type [$default]: " filmtype
filmtype=${filmtype:-$default}
exifargs="$exifargs -imagedescription='PIE PS-5000 slide scanner. VueScanner 32 scanning softare. $filmtype'"

# Enter file name pattern.
default="*.jpg"
read -p "Enter file name pattern [$default]: " namepattern
namepattern=${namepattern:-$default}
exifargs="$exifargs $default"

#Use exiftool to edit EXIF data
echo /home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool "$exifargs"
/home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool "$exifargs"

Я вставил команду "эха", чтобы проверить, что моя команда корректна. Это (в leats для CLI). Результаты запущения скрипта:

richard@richard-laptop:~/Dropbox/Pictures/Photos/test$ sh exifbatch.sh
Press enter to accept default values.
Enter camera manufacturer [Pentax]: 
Enter camera model [K1000]: 
Enter slide film type [Kodachrome slide film.]: 
Enter file name pattern [*.jpg]: 
/home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool -model=Pentax -make=K1000 -imagedescription='PIE PS-5000 slide scanner. VueScanner 32 scanning softare. Kodachrome slide film.' *.jpg
No file specified

Но когда я ввожу тот же самый текст, как создают сценарием на командной строке, это функционирует, как я хочу, находя файлы в текущем каталоге, которые соответствуют шаблону имени. (Предупреждения, брошенные exiftool, ожидаются.):

richard@richard-laptop:~/Dropbox/Pictures/Photos/test$ /home/richard/Dropbox/Pictures/Tools/ExifTool/exiftool -model=Pentax -make=K1000 -imagedescription='PIE PS-5000 slide scanner. VueScanner 32 scanning softare. Kodachrome slide film.' *.jpg
Warning: [minor] Ignored empty rdf:Seq list for darktable:mask_id - 1987_California-01.jpg
Warning: [minor] Ignored empty rdf:Seq list for darktable:mask_id - 1987_California-02.jpg
2 image files updated

Как я изменяю свой basch сценарий так, чтобы команда была выполняемый, как это делает на CLI? Я думаю, что существует что-то не так с тем, как я использую * символ. Если я не помещаю кавычки (") вокруг имени переменной $exifargs, удар сразу интерпретирует *.jpg и добавляет все имена файлов в строку, которая затем соединяет команду exiftool.

Спасибо!

2
задан 24 October 2016 в 00:12

1 ответ

Заключение в кавычки в оболочке хитро. Если Вы хотите использовать несколько параметров, особенно когда некоторые из них содержат пробел, используйте массивы. Обратите внимание, что Вам нужно реальный bash для запущения скрипта для использования массивов, не запускайте сценарий с sh, который работает dash вместо этого, без поддержки массивов.

args=( -model="$cameramake"
       -make="$cameramodel"
       -imagedescription="PIE PS-5000 slide scanner. VueScanner 32 scanning softare. $filmtype"
       $namepattern )
exiftool "${args[@]}"

BTW, действительно ли Вы уверены, что хотите назвать переменную, содержащую модель, "делают" и именование переменной, содержащей производителя "модель"? Также обратите внимание, что "программное обеспечение" имеет w после t.

2
ответ дан 2 December 2019 в 03:44

Другие вопросы по тегам:

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