Подтвердить что ты не робот

Как оценить логическую переменную в блоке if в bash?

Я определил следующую переменную:

myVar=true

теперь я хотел бы запустить что-то по строкам:

if [ myVar ]
then
    echo "true"
else
    echo "false"
fi

Вышеприведенный код действительно работает, но если я попытаюсь установить

myVar=false

он все равно выдаст значение true. В чем может быть проблема?

edit: Я знаю, что могу сделать что-то вроде формы

if [ "$myVar" = "true" ]; then ...

но это неловко.

Спасибо

4b9b3361

Ответ 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 также обрабатывается без вилок.