Il n'y a pas de concept de variable booléenne dans le shell.
Les variables du shell ne pouvaient être text(une chaîne), et que le texte dans certains cas , peut être interprété comme un entier ( 1, 0xa, 010, etc.).
Par conséquent, a flag=truen'implique aucune véracité ou fausseté du tout.
Chaîne
Ce qui pourrait être fait est une comparaison de chaînes [ "$flag" == "true" ]ou utiliser le contenu variable dans une commande et vérifier ses conséquences , comme exécuter true(car il y a à la fois un exécutable appelé trueet un appelé false) comme commande et vérifier si le code de sortie de cette commande est nul (réussi).
$flag; if [ "$?" -eq 0 ]; then ... fi
Ou plus court:
if "$flag"; then ... fi
Si le contenu d'une variable est utilisé comme une commande, un !pourrait être utilisé pour annuler l'état de sortie de la commande, s'il existe un espace entre les deux ( ! cmd), comme dans:
if ! "$flag"; then ... fi
Le script doit se changer en:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Entier
Utilisez des valeurs numériques et des extensions arithmétiques .
Dans ce cas, le code de sortie de $((0))is 1et le code de sortie de $((1))is 0.
En bash, ksh et zsh, l'arithmétique pourrait être effectuée à l'intérieur de a ((..))(notez que le démarrage $est manquant).
flag=0; if ((flag)); then ... fi
Une version portable de ce code est plus compliquée:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
Dans bash / ksh / zsh, vous pouvez faire:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
Alternativement
Vous pouvez "Inverser une variable booléenne" (à condition qu'elle contienne une valeur numérique) comme:
((flag=!flag))
Cela changera la valeur flagsoit 0ou 1.
Remarque : veuillez vérifier les erreurs dans https://www.shellcheck.net/ avant de publier votre code sous forme de question, plusieurs fois cela suffit pour trouver le problème.