В оболочке нет понятия булевой переменной.
Переменные оболочки могут быть только 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/, прежде чем публиковать свой код в виде вопроса. Этого достаточно, чтобы найти проблему.