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 $1
variables? (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
, for
ou autre).
Pour les shells ayant une commande typeset
ou 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 yash
et zsh
qui 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 ksh93
plus 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 ksh93
et bash
pour 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
, zsh
et 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
, zsh
et bash
4.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.
$somevar
une valeur / chaîne si variable n'existe pas:${somevar:=42}
.