Ich habe es überprüft mit bash-4.4.0
:
#!/usr/bin/env bash
set -eu
check() {
if [[ ${array[@]} ]]; then
echo not empty
else
echo empty
fi
}
check # empty
array=(a b c d)
check # not empty
array=()
check # empty
und bash-4.1.5
:
#!/usr/bin/env bash
set -eu
check() {
if [[ ${array[@]:+${array[@]}} ]]; then
echo non-empty
else
echo empty
fi
}
check # empty
array=(a b c d)
check # not empty
array=()
check # empty
Im letzteren Fall benötigen Sie folgendes Konstrukt:
${array[@]:+${array[@]}}
Damit es bei leeren oder nicht gesetzten Arrays nicht fehlschlägt. Das ist, wenn Sie tun, set -eu
wie ich es normalerweise tue. Dies sorgt für eine strengere Fehlerprüfung. Aus den Dokumenten :
-e
Beenden Sie sofort, wenn eine Pipeline (siehe Pipelines), die aus einem einzelnen einfachen Befehl (siehe Einfache Befehle), einer Liste (siehe Listen) oder einem zusammengesetzten Befehl (siehe Zusammengesetzte Befehle) bestehen kann, einen Status ungleich Null zurückgibt. Die Shell wird nicht beendet, wenn der fehlgeschlagene Befehl Teil der Befehlsliste ist, die unmittelbar auf ein while- oder until-Schlüsselwort folgt, Teil des Tests in einer if-Anweisung ist, Teil eines Befehls, der in einem && oder || ausgeführt wird liste mit Ausnahme des Befehls, der auf das letzte && oder || folgt, jeden Befehl in einer Pipeline außer dem letzten, oder wenn der Rückgabestatus des Befehls mit! invertiert wird. Wenn ein zusammengesetzter Befehl außer einer Subshell einen Status ungleich Null zurückgibt, weil ein Befehl fehlgeschlagen ist, während -e ignoriert wurde, wird die Shell nicht beendet. Ein Trap auf ERR, falls gesetzt, wird ausgeführt, bevor die Shell beendet wird.
Diese Option gilt für die Shell-Umgebung und jede Subshell-Umgebung separat (siehe Command Execution Environment) und kann dazu führen, dass Subshells beendet werden, bevor alle Befehle in der Subshell ausgeführt werden.
Wenn ein zusammengesetzter Befehl oder eine Shell-Funktion in einem Kontext ausgeführt wird, in dem -e ignoriert wird, ist keiner der Befehle, die innerhalb des zusammengesetzten Befehls oder Funktionskörpers ausgeführt werden, von der Einstellung -e betroffen, selbst wenn -e festgelegt ist und ein Befehl a zurückgibt Fehlerstatus. Wenn ein zusammengesetzter Befehl oder eine Shell-Funktion -e setzt, während sie in einem Kontext ausgeführt wird, in dem -e ignoriert wird, hat diese Einstellung keine Auswirkung, bis der zusammengesetzte Befehl oder der Befehl, der den Funktionsaufruf enthält, abgeschlossen ist.
-u
Behandeln Sie nicht festgelegte Variablen und Parameter außer den Sonderparametern '@' oder '*' als Fehler, wenn Sie eine Parametererweiterung durchführen. Eine Fehlermeldung wird in den Standardfehler geschrieben und eine nicht interaktive Shell wird beendet.
Wenn Sie das nicht benötigen, können Sie einen :+${array[@]}
Teil weglassen .
Auch merken Sie , dass es wichtig ist , zu verwenden [[
Operator hier, mit [
Ihnen zu bekommen:
$ cat 1.sh
#!/usr/bin/env bash
set -eu
array=(a b c d)
if [ "${array[@]}" ]; then
echo non-empty
else
echo empty
fi
$ ./1.sh
_/1.sh: line 4: [: too many arguments
empty
=
ein String-Operator ist. In diesem Fall funktioniert es problemlos, aber ich verwende-eq
stattdessen den richtigen arithmetischen Operator (nur für den Fall, dass ich zu-ge
oder wechseln möchte-lt
usw.).