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 foobar
la même manière, qu'il soit vide ou non défini. Vous pouvez également utiliser ${foobar-}
pour obtenir une chaîne vide lorsque foobar
est indéfini et la valeur de foobar
sinon (ou mettre toute autre valeur par défaut après le -
).
Dans ksh, if foobar
est 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 foobar
crée un tableau vide.
En bash, les tableaux se comportent de manière différente et surprenante. ${a+1}
ne se développe que 1
si a
est 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 foobar
oudeclare -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 $foobar
dé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 $foobar
provoquerait une erreur sous set -o nounset
.
-v
n'est pas une option pourtest
, mais un opérateur pour les expressions conditionnelles.