Existem dois erros no seu script. A primeira é que você precisa de um espaço entre !
e $flag
, caso contrário, o shell procura um comando chamado !$flag
. O segundo erro é que -eq
é para comparações de inteiros, mas você está usando em uma string. Dependendo do seu shell, você verá uma mensagem de erro e o loop continuará para sempre porque a condição [ "$x" -eq "true" ]
não pode ser verdadeira ou todo valor não inteiro será tratado como 0 e o loop será encerrado se você inserir uma string (incluindo false
) diferente de um número diferente de 0.
Embora ! $flag
esteja correto, é uma má idéia tratar uma string como um comando. Funcionaria, mas seria muito sensível às alterações no seu script, já que você precisaria garantir que $flag
nunca seja nada, exceto true
ou false
. Seria melhor usar uma comparação de string aqui, como no teste abaixo.
flag=false
while [ "$flag" != "true" ]
do
read x
if [ "$x" = "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Há provavelmente uma maneira melhor de expressar a lógica que você procura. Por exemplo, você poderia fazer um loop infinito e quebrá-lo quando detectar a condição de término.
while true; do
read -r x
if [ "$x" = "true" ]; then break; fi
echo "$x: false"
done