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, foobarob es leer oder nicht definiert ist. Sie können auch verwenden ${foobar-}, um eine leere Zeichenfolge abzurufen, wenn foobarundefiniert und der Wert von " foobarelse" (oder einen anderen Standardwert nach " -).
In KSH, wenn foobarerklä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 foobarein leeres Array.
In bash verhalten sich Arrays anders und überraschend. ${a+1}wird nur erweitert, 1wenn aes 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 foobaroderdeclare -p foobar , mit der Ausnahme, dass typeset -p foobarbei deklarierten, aber nicht zugewiesenen Variablen ein Fehler auftritt.
In bash wird wie in ksh set -o nounset; typeset -a foobar; echo $foobarbeim 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 $foobareine Erweiterung auf die leere Zeichenfolge erfolgt, wenn dies zu einem Fehler unter führen würde set -o nounset.
-vist keine Option fürtest, sondern ein Operator für bedingte Ausdrücke.