В оболонці немає поняття булевої змінної.
Змінні оболонки можуть бути тільки 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/, перш ніж публікувати свій код як питання, багато разів, що достатньо, щоб знайти проблему.