Ich denke , die Antwort , die Sie nach sind impliziert (wenn nicht angegeben) von Vinko ‚s Antwort , obwohl es einfach nicht ausgeschrieben ist. Um zu unterscheiden, ob VAR festgelegt, aber leer oder nicht festgelegt ist, können Sie Folgendes verwenden:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Sie können die beiden Tests in der zweiten Zeile wahrscheinlich zu einem kombinieren mit:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Wenn Sie jedoch die Dokumentation zu Autoconf lesen, werden Sie feststellen, dass die Kombination von Begriffen mit ' -a
' nicht empfohlen wird und die Verwendung separater einfacher Tests in Kombination mit ' ' empfohlen wird &&
. Ich bin nicht auf ein System gestoßen, bei dem ein Problem vorliegt. das bedeutet nicht, dass sie früher nicht existierten (aber sie sind heutzutage wahrscheinlich extrem selten, auch wenn sie in der fernen Vergangenheit nicht so selten waren).
Einzelheiten zu diesen und anderen verwandten Shell-Parametererweiterungen , den Befehlen test
oder[
und den bedingten Ausdrücken finden Sie im Bash-Handbuch.
Ich wurde kürzlich per E-Mail nach dieser Antwort mit der Frage gefragt:
Sie verwenden zwei Tests, und ich verstehe den zweiten gut, aber nicht den ersten. Genauer gesagt verstehe ich die Notwendigkeit einer variablen Erweiterung nicht
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
Würde dies nicht dasselbe bewirken?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Faire Frage - die Antwort lautet "Nein, Ihre einfachere Alternative macht nicht dasselbe".
Angenommen, ich schreibe dies vor Ihrem Test:
VAR=
Ihr Test sagt "VAR ist überhaupt nicht gesetzt", aber meiner sagt (implizit, weil es nichts wiedergibt) "VAR ist gesetzt, aber sein Wert ist möglicherweise leer". Versuchen Sie dieses Skript:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
Die Ausgabe ist:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
Im zweiten Testpaar wird die Variable gesetzt, aber auf den leeren Wert gesetzt. Dies ist die Unterscheidung, die die ${VAR=value}
und ${VAR:=value}
Notationen machen. Das Gleiche gilt für ${VAR-value}
und ${VAR:-value}
und ${VAR+value}
und ${VAR:+value}
und und so weiter.
Wie Gili in seiner Antwort betont, schlägt die obige grundlegende Antwort mit fehl , wenn Sie bash
mit der set -o nounset
Option arbeiten unbound variable
. Es ist leicht zu beheben:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Oder Sie können die set -o nounset
Option mit abbrechen set +u
( set -u
entspricht set -o nounset
).