#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")"
.