Учитывая, что в моем текущем рабочем каталоге нет файлов jpg, почему два сценария jpg1.sh и jpg2.sh дают разные результаты? Как понять разницу? Обратите внимание, что единственное различие между сценариями заключается в том, заключать ли подстановку команды $() двойные кавычки.

$ cat jpg1.sh
#!/bin/bash
if [ "$(ls *.jpg | wc -l)" = 0 ]; then
    echo "yes"
else
    echo "no"
fi

$ ./jpg1.sh
ls: *.jpg: No such file or directory
no

$ cat jpg2.sh
#!/bin/bash
if [ $(ls *.jpg | wc -l) = 0 ]; then
    echo "yes"
else
    echo "no"
fi

$ ./jpg2.sh
ls: *.jpg: No such file or directory
yes

< Сильный > Последующие меры

Я свидетельствую, что отмеченный ответ точен - wc -l имеет несколько лишних пробелов в возвращаемом значении. После добавления set -x в оба сценария разница проявляется сама собой.

$ ./jpg1.sh
++ wc -l
++ ls '*.jpg'
ls: *.jpg: No such file or directory
+ '[' '       0' = 0 ']'
+ echo no
no

$ ./jpg2.sh
++ wc -l
++ ls '*.jpg'
ls: *.jpg: No such file or directory
+ '[' 0 = 0 ']'
+ echo yes
yes

Кстати, моя система - macOS Catalina.

2
aafulei 19 Окт 2020 в 17:38

1 ответ

Лучший ответ

В некоторых системах это неверно, потому что wc -l дополняет свой ответ пробелами, а строка, с которой вы сравниваете - 0 - вообще не содержит пробелов. Когда вы используете кавычки, сравнивается точный результат; когда вы их не используете, вывод разбивается на отдельные слова на основе пробелов, и каждое из этих слов раскрывается в виде глобуса перед тем, как оно помещается в командную строку [. Чтобы определить, работаете ли вы в такой системе, добавьте в сценарий set -x, чтобы включить ведение журнала на уровне трассировки, чтобы вы могли видеть точные значения, запрашиваемые для сравнения [.

В нынешних обстоятельствах всей проблемы можно тривиально избежать: нет причин использовать для этой цели ls или wc.

#!/usr/bin/env bash

shopt -s nullglob
jpegs=( *.jpg )
if (( ${#jpegs[@]} == 0 )); then
  echo "No JPEG files were found"
else
  echo "Exactly ${#jpegs[@]} JPEG files were found"
fi
8
Charles Duffy 19 Окт 2020 в 15:04