Portable sur tous les shells POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Faites cela ${foobar:+1}si vous voulez traiter de foobarla même manière, qu'il soit vide ou non défini. Vous pouvez également utiliser ${foobar-}pour obtenir une chaîne vide lorsque foobarest indéfini et la valeur de foobarsinon (ou mettre toute autre valeur par défaut après le -).
Dans ksh, if foobarest déclaré mais non défini, comme dans typeset -a foobar, puis se ${foobar+1}développe dans la chaîne vide.
Zsh n'a pas de variables déclarées mais non définies: typeset -a foobarcrée un tableau vide.
En bash, les tableaux se comportent de manière différente et surprenante. ${a+1}ne se développe que 1si aest un tableau non vide, par exemple
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Le même principe s'applique aux tableaux associatifs: les variables de tableau sont traitées comme définies si elles ont un ensemble d'indices non vide.
Une manière différente, spécifique à bash, de tester si une variable de n'importe quel type a été définie consiste à vérifier si elle est répertoriée dans . Cela signale les tableaux vides tels que définis, contrairement à , mais signale les variables déclarées mais non affectées ( ) comme non définies.${!PREFIX*}${foobar+1}unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Cela revient à tester la valeur de retour de typeset -p foobaroudeclare -p foobar , sauf qu'il typeset -p foobaréchoue sur les variables déclarées mais non affectées.
Dans bash, comme dans ksh, set -o nounset; typeset -a foobar; echo $foobardéclenche une erreur dans la tentative de développement de la variable non définie foobar. Contrairement à ksh, set -o nounset; foobar=(); echo $foobar(ou echo "${foobar[@]}") déclenche également une erreur.
Notez que dans toutes les situations décrites ici, se ${foobar+1}développe dans la chaîne vide si et seulement si $foobarprovoquerait une erreur sous set -o nounset.
-vn'est pas une option pourtest, mais un opérateur pour les expressions conditionnelles.