HOWTO · Bash

Wie man prüft, ob eine Bash-Variable leer ist

Lernen Sie vier Möglichkeiten in Bash kennen, eine Variable auf eine leere Zeichenkette zu testen, einschließlich sicherer Anführungszeichen und des Verhaltens von nicht gesetzten Werten und Werten, die nur aus Leerzeichen bestehen.

Auf dieser Seite

Bei einem bereitgestellten Bash-Wert setzen Sie dessen Expansion in Anführungszeichen, damit die Shell ihn als ein einziges Argument übergibt. Dieses Skript gibt einen Wert mit Bezeichnung aus:

value='Bash'

if [ -z "$value" ]; then
    printf '%s\n' 'No value supplied'
else
    printf 'Value: %s\n' "$value"
fi
Value: Bash

Der Befehl test (auch als [ ... ] geschrieben) gibt Erfolg zurück, wenn die expandierte Zeichenkette null Zeichen enthält. Eine nicht gesetzte Variable expandiert in einer normalen Bash-Shell zu einer leeren Zeichenkette, sodass -z nicht gesetzte und ausdrücklich leere Werte gleich behandelt. Verwenden Sie mit set -u ${value-}, um vor dem Testen einen Standardwert bereitzustellen. Ein Wert wie 0 oder eine Zeichenkette aus Leerzeichen ist nicht leer; der Test prüft Zeichen, nicht, ob ein Wort wie ein Wahrheitswert aussieht.

Prüfen, ob eine Bash-Variable mit -z leer ist

Der Befehl test (auch als [ ... ] geschrieben) gibt einen Erfolgsstatus zurück, wenn die expandierte Zeichenkette null Zeichen enthält. Ein Status ungleich null bedeutet, dass sie mindestens ein Zeichen enthält. Der Test selbst gibt keine Meldung aus; die if-Anweisung wählt aus, welcher Befehl ausgeführt wird.

value=''

if [ -z "$value" ]; then
    printf '%s\n' 'value is empty'
else
    printf '%s\n' 'value is not empty'
fi
value is empty

Bei einer nicht gesetzten Variable gelingt dieselbe Prüfung in Anführungszeichen in der üblichen Shell-Konfiguration. Schreiben Sie mit set -u stattdessen [ -z "${value-}" ], damit die Expansion definiert bleibt. Der Klammerbefehl ist ein Shell-Befehl, dessen Erfolg oder Misserfolg durch seinen Exit-Status dargestellt wird; er gibt nicht automatisch true oder false aus.

Prüfen, ob eine Bash-Variable mit -n nicht leer ist

Verwenden Sie -n für den komplementären Test: Er gibt Erfolg zurück, wenn die expandierte Zeichenkette mindestens ein Zeichen enthält. Der then-Zweig wird für einen nicht leeren Wert ausgeführt, und else wird ausgeführt, wenn der Test fehlschlägt, auch wenn der Wert leer ist.

value='Bash'

if [ -n "$value" ]; then
    printf '%s\n' 'value is not empty'
else
    printf '%s\n' 'value is empty'
fi
value is not empty

Anführungszeichen sind wichtig, weil sie die Expansion als ein einziges Argument bewahren. Verwenden Sie wie bei -z ${value-} innerhalb der Anführungszeichen, wenn das Skript möglicherweise mit set -u läuft und die Variable nicht gesetzt sein könnte. Die Option -n ist besonders gut lesbar, wenn die nächste Aktion erst geschehen soll, nachdem ein Wert bereitgestellt wurde.

Eine Bash-Variable mit einer leeren Zeichenkette vergleichen

Sie können einen Wert mithilfe des bedingten Ausdrucks [[ ... ]] von Bash direkt mit einer leeren Zeichenkette vergleichen. Die Expansion in Anführungszeichen macht die Absicht deutlich, und eine Zeichenkette, die Leerzeichen enthält, ist trotzdem nicht leer, weil diese Leerzeichen Zeichen sind.

value='   '

if [[ "$value" == "" ]]; then
    printf '%s\n' 'value is empty'
else
    printf '%s\n' 'value is not empty'
fi
value is not empty

Dieses Beispiel nimmt den zweiten Zweig: Leerzeichen verschwinden innerhalb von [[ ... ]] nicht. Vergleichen Sie bei Skripten, die set -u verwenden, ${value-}, damit eine nicht gesetzte Variable als leere Zeichenkette behandelt wird.

Eine Variable mit der Parameter-Expansion ${parameter:+word} prüfen

Die Form ${parameter:+word} expandiert zu word, wenn der Parameter gesetzt und nicht null ist. Sie expandiert zu nichts, wenn der Parameter nicht gesetzt ist oder eine leere Zeichenkette enthält. Testen Sie die Expansion, während Sie sie in Anführungszeichen setzen:

value='Bash'

if [ "${value:+present}" ]; then
    printf '%s\n' 'value is set and nonempty'
else
    printf '%s\n' 'value is unset or empty'
fi
value is set and nonempty

Dieses Idiom ist nützlich, wenn die Unterscheidung, die Sie benötigen, „gesetzt und nicht leer“ gegenüber „nicht gesetzt oder leer“ lautet. Es unterscheidet diese letzteren beiden Zustände nicht voneinander. Um einen nicht gesetzten Parameter von einem gesetzten, aber leeren zu unterscheiden, verwenden Sie die Prüfung [[ -v value ]] von Bash als separaten Test.