Выполнение кода в if-statement (Bash)

Новый вопрос:

Я не могу этого сделать (Ошибка: line 2: [: ==: unary operator expected):

if [ $(echo "") == "" ]
then
    echo "Success!"
fi

Но это прекрасно работает:

tmp=$(echo "")
if [ "$tmp" == "" ]
then
    echo "Success!"
fi

Почему?

Оригинальный вопрос:

Можно ли получить результат команды внутри оператора if?

Я хочу сделать что-то вроде этого:

if [ $(echo "foo") == "foo" ]
then
    echo "Success!"
fi

В настоящее время я использую эту работу:

tmp=$(echo "foo")
if [ "$tmp" == "foo" ]
then
    echo "Success!"
fi

Ответ 1

Короткий ответ да. Вы можете оценить команду внутри условия if. Единственное, что я изменил бы в первом примере, это цитата:

if [ "$(echo foo)" == "foo" ]
then 
    echo "Success"'!'
fi
  • Обратите внимание на забавную цитату для '!'. Это отключает специальное поведение ! внутри интерактивного сеанса bash, что может привести к неожиданным результатам.

После вашего обновления ваша проблема становится ясной, и изменение цитирования фактически решает ее:

Оценка $(...) происходит до оценки if [...], поэтому, если $(...) оценивает пустую строку, [...] становится if [ == ""], что является незаконным синтаксисом.

Способом решения этого вопроса является наличие кавычек вне выражения $(...). Здесь вы можете столкнуться с липкой проблемой цитирования внутри цитаты, но я буду рассматривать этот вопрос по другому вопросу.