Es gibt kein Konzept für eine Boolesche Variable in der Shell.
Shell - Variablen könnten nur sein text(eine Zeichenfolge), und in einigen Fällen, dass Text als Integer interpretiert werden ( 1, 0xa, 010, etc.).
Daher flag=trueimpliziert a überhaupt keine Wahrhaftigkeit oder Falschheit der Hülle.
String
Sie können entweder einen Zeichenfolgenvergleich durchführen [ "$flag" == "true" ]oder den Variableninhalt in einem Befehl verwenden und dessen Konsequenzen überprüfen , z. B. "execute" true(da sowohl eine ausführbare als auch trueeine aufgerufene Datei vorhanden ist false) als Befehl und prüfen, ob der Beendigungscode dieses Befehls Null ist (erfolgreich).
$flag; if [ "$?" -eq 0 ]; then ... fi
Oder kürzer:
if "$flag"; then ... fi
Wenn der Inhalt einer Variablen als Befehl verwendet wird, kann a !verwendet werden, um den Beendigungsstatus des Befehls zu negieren, wenn zwischen both ( ! cmd) ein Leerzeichen vorhanden ist , wie in:
if ! "$flag"; then ... fi
Das Skript sollte folgendermaßen geändert werden:
flag=false
while ! "$flag"
do
read x
if [ "$x" == "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
Ganze Zahl
Verwenden Sie numerische Werte und arithmetische Erweiterungen .
In diesem Fall sind der Exit-Code von $((0))is 1und der Exit-Code von $((1))is 0.
In bash, ksh und zsh könnte die Arithmetik innerhalb von a ausgeführt werden ((..))(beachten Sie, dass der Anfang $fehlt).
flag=0; if ((flag)); then ... fi
Eine portable Version dieses Codes ist komplizierter:
flag=0; if [ "$((flag))" -eq 0 ]; then ... fi # test for a number
flag=0; if [ "$((flag))" == 0 ]; then ... fi # test for the string "0"
In bash / ksh / zsh können Sie Folgendes tun:
flag=0
while ((!flag))
do
read x
[ "$x" == "true" ] && flag=1
echo "${x} : ${flag}"
done
Alternative
Sie können "eine boolesche Variable invertieren" (vorausgesetzt, sie enthält einen numerischen Wert) als:
((flag=!flag))
Das ändert den Wert von flagentweder 0oder 1.
Hinweis : Überprüfen Sie https://www.shellcheck.net/ auf Fehler, bevor Sie Ihren Code als Frage veröffentlichen. Dies ist oft genug, um das Problem zu finden.