Não há conceito de uma variável booleana no shell.
Variáveis do shell só poderia ser text(uma string), e, em alguns casos, esse texto pode ser interpretado como um inteiro ( 1, 0xa, 010, etc.).
Portanto, a flag=truenão implica em veracidade ou falsidade para a concha.
Corda
O que poderia ser feito é uma comparação de cadeias [ "$flag" == "true" ]ou usar o conteúdo da variável em algum comando e verificar suas conseqüências , como execute true(porque há um executável chamado truee um chamado false) como um comando e verifique se o código de saída desse comando é zero (bem sucedido).
$flag; if [ "$?" -eq 0 ]; then ... fi
Ou mais curto:
if "$flag"; then ... fi
Se o conteúdo de uma variável for usado como um comando, a !poderá ser usado para negar o status de saída do comando, se existir um espaço entre ambos ( ! cmd), como em:
if ! "$flag"; then ... fi
O script deve mudar para:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Inteiro
Use valores numéricos e expansões aritméticas .
Nesse caso, o código de saída de $((0))é 1e o código de saída de $((1))é 0.
No bash, ksh e zsh, a aritmética pode ser realizada dentro de um ((..))(observe que a partida $está faltando).
flag=0; if ((flag)); then ... fi
Uma versão portátil deste código é mais complicada:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
No bash / ksh / zsh, você pode fazer:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
alternativamente
Você pode "Inverter uma variável booleana" (desde que contenha um valor numérico) como:
((flag=!flag))
Isso mudará o valor de flagpara ou 0ou 1.
Nota : Verifique se há erros em https://www.shellcheck.net/ antes de postar seu código como uma pergunta, muitas vezes o suficiente para encontrar o problema.