В оболонці немає поняття булевої змінної.
Змінні оболонки можуть бути тільки text
(рядок), і, в деяких випадках, цей текст може бути витлумачений як ціле число ( 1
, 0xa
, 010
і т.д.).
Тому flag=true
мається на увазі відсутність правдивості або неправдивості для оболонки.
Рядок
Що можна зробити, це або порівняння рядків, [ "$flag" == "true" ]
або використання змінного вмісту в якійсь команді і перевірка його наслідків , як виконати true
(оскільки є і виконуваний файл, який викликається, true
і один, який називається false
) як команда, і перевірити, чи не є вихідний код цієї команди нульовим. (успішний).
$flag; if [ "$?" -eq 0 ]; then ... fi
Або коротше:
if "$flag"; then ... fi
Якщо вміст змінної використовується як команда, a !
може бути використаний для заперечення стану виходу команди, якщо між обома ( ! cmd
) існує пробіл , як у:
if ! "$flag"; then ... fi
Сценарій слід змінити на:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Цілий
Використовуйте числові значення та арифметичні розширення .
У цьому випадку код виходу $((0))
є 1
і вихідний код $((1))
є 0
.
В bash, ksh і zsh арифметику можна було б виконати всередині a ((..))
(зауважте, що старт $
відсутній).
flag=0; if ((flag)); then ... fi
Портативна версія цього коду є більш перекрученою:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
В bash / ksh / zsh ви можете:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
Як варіант
Ви можете "Інвертувати булеву змінну" (за умови, що вона містить числове значення) як:
((flag=!flag))
Це змінить значення flag
на 0
або 1
.
Примітка . Будь ласка, перевірте наявність помилок на https://www.shellcheck.net/, перш ніж публікувати свій код як питання, багато разів, що достатньо, щоб знайти проблему.