Cela dépend de ce que vous voulez dire par existe .
Une variable déclarée mais non affectée existe- t-elle?
Est -ce une variable tableau (ou hachage) qui a été attribué une liste vide existe ?
Est -ce une variable nameref pointage à une variable qui n'est pas actuellement affectée existe ?
Considérez-vous $-, $#, des $1variables? (POSIX pas).
Dans les coquilles de type Bourne, la manière canonique est la suivante:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
Cela fonctionne pour les variables scalaires et d’autres paramètres pour indiquer si une valeur a été affectée à une variable (vide ou non, automatiquement, à partir de l’environnement, des affectations read, forou autre).
Pour les shells ayant une commande typesetou declare, les variables déclarées mais non affectées ne seront pas définies comme définies, sauf dans .zsh
Pour les shells qui prennent en charge les tableaux, à l'exception de yashet zshqui ne généreraient pas de variables de tableau définies , à moins que l'élément d'indice 0 ait été défini.
Pour bash(mais non ksh93plus zsh), pour les variables de type tableau associatif , cela ne les indiquerait pas comme étant définies à moins que leur élément de la clé "0" ait été défini.
Pour ksh93et bashpour les variables de type nameref , cela ne renvoie true que si la variable référencée par nameref est elle-même considérée comme définie .
Pour ksh, zshet bash, une meilleure approche pourrait être:
if ((${#var[@]})); then
echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi
Pour ksh93, zshet bash4.4 ou plus, il y a aussi:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
Ce qui rapportera les variables qui ont été définies ou déclarées.
$somevarune valeur / chaîne si variable n'existe pas:${somevar:=42}.