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=true
n'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é true
et 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 1
et 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 flag
soit 0
ou 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.