Условие скрипта 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 

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

4 Solutions collect form web for “Условие скрипта Bash всегда передается, даже когда grep не должен возвращать ничего”

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

 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 

если хотите.

  • Гибридный код в сценариях оболочки. Обмен переменными
  • RHEL 7 как запустить давний скрипт перед выключением / перезагрузкой systemd
  • Как захватить форматирование текста в bash?
  • Интеграция `afuse` с` sshfs` как (systemd?) User-daemon, порожденная логином или первой оболочкой
  • Нажмите кнопку html через скрипт оболочки?
  • Как я могу использовать sed, чтобы отрезать строку от строки?
  • Фильтрация вывода журнала на отдельных линиях
  • Замена шаблонов
  • Debian - использование TFTP в сценарии bash
  • Как я могу автоматически войти в список серверов, чтобы предотвратить блокировку учетной записи?
  • Скачайте несколько тысяч файлов - как?
  • Interesting Posts

    Что я тут делаю не так (проблема с петлями)

    Нет загрузочного меню с Linux Mint и Windows 7

    Состояние аккумулятора Lenovo T440s неизвестно, но зарядка?

    Команда для отображения всех изображений в каталоге в одном окне браузера, от термина?

    Как загружать файлы с удаленного сервера Linux (Ubuntu)?

    Почему переменные среды не установлены Gnome

    Имеют ли tmpfs и devtmpfs одну и ту же область памяти?

    Замена в VIM с неизменной регулярной выраженной частью

    Что произойдет, если я установлю дистрибутив GNU / Linux для ARMv7h на машине ARMv7l?

    Как удалить файл по имени файла, установленному как даты?

    Совершенно новый для Linux – запуск сервера веб-сервера / базы данных, необходимо подключиться к моим серверам – как?

    SFTP Chroot и SSH

    изменять текстовый файл только с одним номером, подлежащим ограничениям

    Gnome-tweak-tool – не может читать параметры ввода из-за эллипсированного текста

    Skype не запускается на xfce с Slackware 64 бит multilib

    Linux и Unix - лучшая ОС в мире.