Intereting Posts
losetup: невозможно найти неиспользуемое устройство цикла Где поставить политику SElinux, чтобы обеспечить прекрасное завершение работы системы? Существуют ли какие-либо недостатки в отношении использования qsub для запуска задач все время? Как отключить системный звуковой сигнал LMDE? Цикл forach для вывода ls Как работает inotify? Как я могу подавить пространство между сгенерированными аргументами во время расширения фигурной скобки? Могут ли другие пользователи просмотреть аргументы, переданные команде? Мост lxc vs virtualbox «Permission denied» пытается получить файл с использованием TFTP Исправить вход аудио Skype в Mint 17 Cinnamon Как установить пароль WiFi на модем – афферрация буйвола g54 Где isoboot, документируются параметры boot = isolinux iso-scan / filename? Организация беспорядочной папки на основе типа файла Как напечатать переменную bash, которая имеет массив как значение

Условие скрипта Bash всегда передается, даже когда grep не должен возвращать ничего

У меня возникают проблемы при попытке вернуть один файл изображения, который соответствует параметрам. $ 1 – параметр поиска, в этом случае он является «реальным», который является тегом на одном из изображений (не двух) в данной папке. Что происходит, когда я называю это «./test.sh real», он печатает оба изображения, а не только одно. Я предполагаю, что мне приходится иметь дело со мной, устанавливая функцию return как переменную и / или условие моего условия, но я не совсем уверен.

#!/bin/bash for f in specim/*.jpg do image=$(exiftool -EXIF:XPKeywords $f | grep "$1") if [[ ! -z "$image// }" ]]; then echo $f fi 

что возвращается:

 ../../test.sh real specim/image2.jpg specim/image.jpg 

Этот сценарий bash отпечатывает то, что я хочу, только одно изображение, а не оба (как материал exiftool, который я не хочу, но это был просто тест):

 #!/bin/bash for f in *.jpg do exiftool -EXIF:XPKeywords $f | grep $1 done 

результат:

 ./test2.sh real XP Keywords : name;real 

любая помощь будет оценена, и это, наверное, просто супер … Спасибо

Вероятно, как вы подозревали, просто небольшое исправление, попробуйте вместо этого:

 if [[ ! -z "$image" ]]; then 

объяснение

Скажем, когда есть соответствие exiftool и grep, тогда ваша переменная $image содержит следующее:

 abcabcabc 

Но когда нет выхода, $image содержит: (ничего)

В вашем тестовом состоянии у вас было:

 if [[ ! -z "$image// }" ]]; then 

Итак, в первом случае bash видит это:

 if [[ ! -z "abcabcabc// }" ]]; then 

Но во втором случае, bash видит это:

 if [[ ! -z "// }" ]]; then 

Тест говорит, что if "// }" is NOT zero-value, then... однако "// }" всегда будет не нулевым значением, это что-то, это строка, состоящая из двух сокращений – пробел и фигурная скобка. Так как там что-то есть, что-то не нулевое значение, поэтому then эта часть запускается, даже если у вас нет совпадений в $image . Поэтому, удалив этот // } он должен работать.

Другим вариантом может быть:

 if [[ -n "$image" ]]; then 

чтобы проверить, содержит ли только переменную $image , а не ! -z ... ! -z ...

Вы используете exiftool и grep (+ тест и эхо) для каждого .jpg в этом каталоге … не очень эффективно …
exiftool может сделать все это самостоятельно с помощью опции -if EXPR , например

 exiftool -q -s3 -if '$tag=~/pattern/' -filename ./*.jpg 

(здесь в сочетании с -q – quiet и -s[NUM] – короткий выходной формат: только значения печати, см. руководство для получения более подробной информации)
Итак, в вашем конкретном случае весь сценарий можно заменить на:

 exiftool -q -s3 -if \$Exif:XPKeywords=~/"$1"/ -filename specim/*.jpg 

например, запуск сценария test.sh с четырьмя тестовыми файлами со следующими значениями XPKeywords :

 exiftool -Exif:XPKeywords specim/*.jpg ======== specim/1.jpg XP Keywords : xname;real ======== specim/2.jpg XP Keywords : yname;different ======== specim/3.jpg XP Keywords : wname;true ======== specim/4.jpg XP Keywords : wname;unreal 4 image files read 

запуск test.sh real возвратов:

 1.jpg 4.jpg 

и test.sh unreal возвращается:

 4.jpg 

Статус выхода grep заключается в том, соответствует ли он чему-либо, поэтому зачем записывать вывод grep, а затем тестировать его как строку для пустоты? Вы могли бы сделать

 if exiftool -EXIF:XPKeywords $f | grep -q "$1" ; then echo $f fi 

если хотите.