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=true
impliziert 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 true
eine 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 1
und 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 flag
entweder 0
oder 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.