Как оценить логическую переменную в блоке if в bash?
Я определил следующую переменную:
myVar=true
теперь я хотел бы запустить что-то по строкам:
if [ myVar ]
then
echo "true"
else
echo "false"
fi
Вышеприведенный код действительно работает, но если я попытаюсь установить
myVar=false
он все равно выдаст значение true.
В чем может быть проблема?
edit: Я знаю, что могу сделать что-то вроде формы
if [ "$myVar" = "true" ]; then ...
но это неловко.
Спасибо
Ответы
Ответ 1
bash не знает логических переменных, а также test
(это то, что вызывается при использовании [
).
Решение:
if $myVar ; then ... ; fi
потому что true
и false
- это команды, которые возвращают 0
или 1
соответственно, что ожидает if
.
Обратите внимание, что значения "заменены". Команда после if
должна возвращать 0
при успешном выполнении, а 0
означает "false" на большинстве языков программирования.
ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ. Это работает, потому что BASH расширяет переменную, затем пытается выполнить результат как команду! Убедитесь, что переменная не может содержать вредоносный код, например rm -rf /
Ответ 2
Обратите внимание, что конструктор if $myVar; then ... ;fi
имеет проблему безопасности, которую вы можете избежать с помощью
case $myvar in
(true) echo "is true";;
(false) echo "is false";;
(rm -rf*) echo "I just dodged a bullet";;
esac
Вам также может потребоваться переосмыслить, почему if [ "$myvar" = "true" ]
кажется вам неудобным. Это сравнение строк в оболочке, которое, возможно, позволяет обрабатывать процесс только для получения статуса выхода. Вилка - тяжелая и дорогая операция, в то время как сравнение ничей дешево. Подумайте несколько циклов процессора против нескольких тысяч. Мое решение case
также обрабатывается без вилок.