Wenn ich einige Befehle ausführen möchte, deren Variablen nicht festgelegt sind, verwende ich:
if [[ -z "$a" || -z "$v" ]]
then
echo "a or b are not set"
fi
Die gleiche Syntax funktioniert jedoch nicht -v
. Ich muss Folgendes verwenden:
if [[ -v a && -v b ]]
then
echo "a & b are set"
fi
Was ist die Geschichte dahinter? Ich verstehe nicht, warum die Syntax nicht dieselbe sein würde. Ich habe gelesen, dass dies -v
eine etwas neue Ergänzung zu Bash (4.2) ist .
""
Antworten:
Testoperatoren
-v
und-z
sind einfach nicht gleich.Der Operator gibt an
-z
, ob eine Zeichenfolge leer ist. Es ist also wahr, dass[[ -z "$a" ]]
sich eine gute Annäherung an "Variablea
ist nicht gesetzt" ergibt, aber keine perfekte:Der Ausdruck ergibt true, wenn er
a
auf die leere Zeichenfolge gesetzt und nicht auf den Wert gesetzt ist.Das beiliegende Skript schlägt fehl, wenn
a
es nicht festgelegt ist und die Optionnounset
aktiviert ist.Auf der anderen Seite
-v a
wird genau "Variablea
gesetzt" sein, auch in Randfällen. Es sollte klar sein , dass vorbei ,$a
anstatta
zu-v
wäre nicht richtig, da es , dass möglicherweise-unset Variable erweitern würde , bevor der Test Operator es sieht; Daher muss es Teil der Aufgabe dieses Operators sein, diese Variable, auf die der Name zeigt, zu überprüfen und festzustellen, ob sie festgelegt ist.quelle
a=""
?[[ -v ]]
. Gibt wie bei einem variablen Array- Typ[[ -v var ]]
nur dann true zurück, wenn${var[0]}
(praktisch wie$var
) festgelegt ist. Auch für assoziatives Array${var[0]}
(nicht${var[00]}
zum Beispiel).[[ -v var[@] ]]
würde true zurückgeben, wenn für das Array ein Wert festgelegt ist (würde false für eine Variable zurückgeben, die als festgelegt istvar=()
). Das liegt an der verrückten Art und Weise, wie Variablen in ksh / bash eingegeben werden. Siehezsh
für eine weniger verwirrende Variablentypisierung.-z
Testet einen Wert, während-a
ein Name getestet wird .Es gibt einen Unterschied in der Bedeutung von
-z
und-v
:Mit
-z
können Sie eine Variable, der ein leerer Wert zugewiesen wurde, nicht von einer Variablen unterscheiden, der kein Wert zugewiesen wurde.Auch
[[ -z $x ]]
ist noch sinnvollset -u
, während[[ -v x ]]
nicht.quelle