HOWTO · Bash
Deklarieren und verwenden Sie Booleans in Bash
Dieses Tutorial demonstriert die Deklaration und Verwendung von booleschen Werten in Bash.
Auf dieser Seite
Bash besitzt keinen eigenen booleschen Variablentyp. Um eine Entscheidung darzustellen, können Sie direkt den Erfolgs- oder Fehlerstatus eines Befehls verwenden oder eine Wertkonvention festlegen, etwa 1 für aktiviert und 0 für deaktiviert. Das sind unterschiedliche Dinge: Der Befehlsstatus 0 bedeutet Erfolg, ein Wert ungleich null bedeutet Fehler. Die folgenden Beispiele zeigen beide Möglichkeiten, ohne beliebige Variableninhalte als Befehle zu behandeln.
Boolesche Werte und Exit-Status in Bash
Die Befehle true und false melden Erfolg beziehungsweise Fehler. Eine if-Anweisung wertet ihren Status aus; es sind Befehle und keine besonderen Werte, die in Variablen gespeichert werden. Wenn ein Wert gespeichert oder als Argument übergeben werden soll, kann ein Skript auch ein dokumentiertes Integer-Flag verwenden.
true und false in Bedingungen verwenden
Verwenden Sie einen Befehl direkt als Bedingung, wenn es darauf ankommt, ob er erfolgreich ist oder fehlschlägt. So kann Bash anhand des Exit-Status des Befehls verzweigen.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
if true; then
printf '%s\n' 'The command succeeded.'
fi
if false; then
printf '%s\n' 'This branch is skipped.'
else
printf '%s\n' 'The command reported failure.'
fi
Vermeiden Sie if $value; then, um eine Variable zu testen. Bash würde versuchen, den Inhalt der Variablen als Befehl auszuführen. Vergleichen Sie stattdessen einen bekannten Wert oder verwenden Sie einen Testausdruck.
Booleschenähnlichen Zustand in Variablen darstellen
Ein Integer-Flag ist eine Konvention der Anwendung. Legen Sie daher die Zuordnung fest und dokumentieren Sie sie. Dieses Beispiel verwendet 1 für aktiviert und 0 für deaktiviert. Arithmetische Bedingungen vergleichen den Wert als Zahl und verwechseln ihn nicht mit einem Befehlsstatus.
Führen Sie dieses Bash-Beispiel aus, um zu sehen, wie das aktivierte Flag numerisch geprüft, an eine Funktion übergeben und zur Steuerung der Schleifenausgabe verwendet wird.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
enabled=1
if (( enabled == 1 )); then
printf '%s\n' 'Feature is enabled.'
else
printf '%s\n' 'Feature is disabled.'
fi
report_feature() {
local flag=$1
if (( flag == 1 )); then
printf '%s\n' 'Function received an enabled flag.'
else
printf '%s\n' 'Function received a disabled flag.'
fi
}
report_feature "$enabled"
for item in alpha beta; do
if (( enabled == 1 )); then
printf 'Processing %s.\n' "$item"
fi
done
Feature is enabled.
Function received an enabled flag.
Processing alpha.
Processing beta.
Verwenden Sie für Dateiüberprüfungen den passenden Testausdruck. Setzen Sie Variablenerweiterungen in [-Tests in Anführungszeichen, damit ein fehlender oder Leerzeichen enthaltender Wert die Argumente des Tests nicht verändert. Für Bash-spezifische Bedingungen können Sie [[ ... ]] oder arithmetische Syntax verwenden.
Bedingungen mit logischen Operatoren verknüpfen
&& führt den Befehl rechts davon nur aus, wenn der Befehl links davon erfolgreich ist. || führt die rechte Seite aus, wenn der linke Befehl fehlschlägt. Beide Operatoren verwenden also den Befehlsstatus, bei dem null für Erfolg steht. Klammern Sie Ausdrücke oder verwenden Sie separate if-Anweisungen, wenn die gewünschte Gruppierung sonst schwer zu erkennen wäre.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
is_logged_in=1
is_admin=0
if (( is_logged_in == 1 && is_admin == 1 )); then
printf '%s\n' 'Access granted.'
else
printf '%s\n' 'Access denied.'
fi
config_file=/etc/example.conf
if [[ -f "$config_file" ]] && printf '%s\n' 'Configuration file exists.'; then
:
fi
Die erste Bedingung verknüpft zwei Integer-Flags. Die zweite prüft eine Datei, bevor sie ihre Meldung ausgibt; [[ -f ... ]] ist ein Bash-Bedingungsausdruck und kein Befehl, der eine boolesche Variable erzeugt.
Flags in Funktionen und Schleifen verwenden
Übergeben Sie ein ausdrücklich definiertes Flag als Funktionsargument in Anführungszeichen und vergleichen Sie es anschließend nach derselben Konvention. Eine Schleife kann diesen Zustand auslesen oder ändern, um zu entscheiden, ob sie fortgesetzt wird. Formulieren Sie die Abbruchbedingung eindeutig, damit die Schleife nicht unbegrenzt weiterläuft.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
keep_running=1
step=0
while (( keep_running == 1 )); do
(( step += 1 ))
printf 'Step %d.\n' "$step"
if (( step >= 3 )); then
keep_running=0
fi
done
Arithmetische Befehle liefern einen Status zurück, der vom Wert des Ausdrucks abhängt. Hier ist die Erhöhung positiv, und die Schleifenbedingung verwendet das gespeicherte Flag, um nach Erreichen des Zählers von drei anzuhalten.
Häufige Fehler bei booleschen Werten in Bash
- Nehmen Sie nicht an, dass Bash
0alstrueund1alsfalsebehandelt. Diese Zuordnung legen Sie selbst fest; beim Status von Shell-Befehlen bedeutet null Erfolg und jeder Wert ungleich null Fehler. - Erweitern Sie eine beliebige Variable nicht als Befehl, um zu prüfen, ob sie
trueist. Vergleichen Sie ihren Wert oder verwenden Sie einen Bedingungsausdruck. - Setzen Sie Variablenerweiterungen in Tests mit einfachen eckigen Klammern in Anführungszeichen, zum Beispiel
[ "$name" = "ready" ]. Verwenden Sie für Zahlen(( number == 1 ))oder setzen Sie die Operanden in einem numerischen Test in Anführungszeichen. - Denken Sie daran, dass
&&und||auf den Erfolg eines Befehls reagieren, nicht auf Wörter wietrueundfalse, die in einer Variablen gespeichert sind.
Wählen Sie eine Flag-Konvention und verwenden Sie sie konsequent bei Zuweisungen und Vergleichen. Wenn Sie prüfen möchten, ob eine Operation erfolgreich war, verwenden Sie den Befehlsstatus.