В оболочке нет понятия булевой переменной.
Переменные оболочки могут быть только text(строка), и, в некоторых случаях, этот текст может быть истолкован как целое число ( 1, 0xa, 010и т.д.).
Следовательно, a не flag=trueподразумевает никакой правдивости или ложности для оболочки.
строка
То, что можно сделать, - это либо сравнение строк, [ "$flag" == "true" ]либо использование содержимого переменной в некоторой команде, и проверка ее последствий , например, выполнение true(потому что есть и вызываемый исполняемый файл, trueи вызываемый false) в качестве команды, и проверка, равен ли код выхода этой команды нулю. (успешно).
$flag; if [ "$?" -eq 0 ]; then ... fi
Или короче:
if "$flag"; then ... fi
Если содержимое переменной используется в качестве команды, то !можно использовать ее для отмены статуса завершения команды, если между двумя ( ! cmd) существует пробел , как в:
if ! "$flag"; then ... fi
Сценарий должен измениться на:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
целое число
Используйте числовые значения и арифметические расширения .
В этом случае код выхода $((0))is 1и код выхода $((1))is 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/, прежде чем публиковать свой код в виде вопроса. Этого достаточно, чтобы найти проблему.