Portabel auf alle POSIX-Shells:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Machen Sie das, ${foobar:+1}
wenn Sie gleich behandeln möchten, foobar
ob es leer oder nicht definiert ist. Sie können auch verwenden ${foobar-}
, um eine leere Zeichenfolge abzurufen, wenn foobar
undefiniert und der Wert von " foobar
else" (oder einen anderen Standardwert nach " -
).
In KSH, wenn foobar
erklärt wird , aber nicht definiert, wie in typeset -a foobar
, dann ${foobar+1}
auf die leere Zeichenfolge erweitert.
Zsh hat keine deklarierten, aber nicht gesetzten Variablen: Erstellt typeset -a foobar
ein leeres Array.
In bash verhalten sich Arrays anders und überraschend. ${a+1}
wird nur erweitert, 1
wenn a
es sich um ein nicht leeres Array handelt, z
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Dasselbe Prinzip gilt für assoziative Arrays: Array-Variablen werden wie definiert behandelt, wenn sie eine nicht leere Menge von Indizes enthalten.
Eine andere, bash-spezifische Methode zum Testen, ob eine Variable eines beliebigen Typs definiert wurde, besteht darin, zu überprüfen, ob sie in aufgeführt ist . Dies meldet leere Arrays als definiert, im Gegensatz zu deklarierten aber nicht zugewiesenen Variablen ( ) jedoch als undefiniert.${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Dies entspricht dem Testen des Rückgabewerts von typeset -p foobar
oderdeclare -p foobar
, mit der Ausnahme, dass typeset -p foobar
bei deklarierten, aber nicht zugewiesenen Variablen ein Fehler auftritt.
In bash wird wie in ksh set -o nounset; typeset -a foobar; echo $foobar
beim Versuch, die undefinierte Variable zu erweitern , ein Fehler ausgelöst foobar
. Anders als in ksh löst set -o nounset; foobar=(); echo $foobar
(oder echo "${foobar[@]}"
) auch einen Fehler aus.
Beachten Sie, dass in allen hier beschriebenen Situationen ${foobar+1}
nur dann $foobar
eine Erweiterung auf die leere Zeichenfolge erfolgt, wenn dies zu einem Fehler unter führen würde set -o nounset
.
-v
ist keine Option fürtest
, sondern ein Operator für bedingte Ausdrücke.