Выполнение кода в if-инструкции (Bash)

#bash #if-statement

#bash #if-инструкция

Вопрос:

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

Я не могу этого сделать (ошибка: 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 [ $(echo "foo") == "foo" ]; then echo "Success!"; fi

2. О, извините, настоящая проблема в том, что я не могу этого сделать: if [ $(echo "") == "" ]; then echo "Success!"; fi

Ответ №1:

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

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

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

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

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

Комментарии:

1. Я только что протестировал этот код, и он по-прежнему запускает новую оболочку. После того, как я выхожу из командной строки, выводится сообщение об успешном завершении. Использование GNU bash 4.1.5

2. Что, если мне нужно использовать команду, которая требует, чтобы я экранировал переменную внутри этого? Example str="123 456 789"; if [ "$(someCommand $str)" == "foo" ]; then echo "Success!"; fi и someCommand проверяет только первый параметр

3. 🙁 Моя ошибка, я случайно запустил новый bash при запуске скрипта. Все работает правильно. 😀

4. @Tyilo, заключение в двойные кавычки позволяет оценить $str поэтому ваш пример должен сработать, но сохранение пробелов может оказаться более сложной проблемой: например, если str="123 456 789" (обратите внимание на 2 пробела между «123» и «456»), в этом случае вы можете попробовать "$(someCommand "$str")" .