Почему мой оператор if всегда оценивается как ложный в операторе switch? - PullRequest
0 голосов
/ 05 декабря 2018

Мой оператор if всегда оценивается как ложный в моем операторе switch.Я попытался использовать булевы переменные, а теперь просто цифры, и я получаю тот же результат.Оператор if не работает.

#!/bin/bash

hidden=1

while true; do

    read -sn 1 input

    case $input in
        q ) 
                ;;
        n )     
                ;;
        h )     if ! [ $hidden ]; then  # hide video
                    echo "hidden (false): $hidden"
                    hidden=1
                else    # show video
                    echo "hidden (true): $hidden"
                    hidden=0
                fi
                ;;
        '' )    ;;
        \? );;  
    esac

done
exit 0

Если я запускаю его и несколько раз нажимаю "h", я получаю ..

hidden (true): 1
hidden (true): 0
hidden (true): 0
hidden (true): 0

Почему мой оператор if всегда оценивается какложь?

1 Ответ

0 голосов
/ 05 декабря 2018

[ $hidden ] эквивалентно [ -n $hidden ] и проверяет, расширяется ли $hidden до непустой строки;0 и 1 являются непустыми строками и имеют значение true, поэтому ! [ $hidden ] равно false.

Примечание: если $hidden на самом деле пустая строка, вы получите синтаксисошибка;чтобы предотвратить это, напишите так:

if ! [ "$hidden" ]; then

Чтобы сделать то, что я думаю, вы хотите, вы должны использовать другую условную конструкцию :

if ! (( hidden )); then

Thisоценивает hidden в арифметическом контексте ;значение 0 считается ложным, а ненулевое - истиной.В арифметическом контексте вы можете пропустить $, следовательно, hidden вместо $hidden.Цитирование тоже не требуется.Обратите внимание, что (( )) является расширением Bash;если вы хотите то же самое в POSIX sh, вы должны использовать

if ! [ "$hidden" = 1 ]; then
...