60 votes

En Bash, comment puis-je tester si une variable est définie en mode "-u" ?

Je viens de découvrir set -u en bash et cela m'a aidé à trouver plusieurs bogues qui n'avaient pas été vus auparavant. Mais j'ai aussi un scénario où je dois tester si une variable est définie avant de calculer une valeur par défaut. La meilleure solution que j'ai trouvée est la suivante :

if [ "${variable-undefined}" == undefined ]; then
    variable="$(...)"
fi

ce qui fonctionne (tant que la variable n'a pas la valeur de chaîne de caractères undefined ). Je me demandais s'il existait un meilleur moyen ?

0voto

Luc M Points 4950

Au début de votre script, vous pourriez définir vos variables avec une valeur vide

variable_undefined=""

Puis

if [ "${variable_undefined}" == "" ]; then
    variable="$(...)"
fi

0voto

George Points 21
if [ "${var+SET}" = "SET" ] ; then
    echo "\$var = ${var}"
fi

Je ne sais pas à quand remonte le support de ${var+value}, mais il fonctionne au moins depuis la version 4.1.2. Les versions plus anciennes n'avaient pas de ${var+value}, mais seulement ${var:+value}. La différence est que ${var:+value} n'est évalué à "valeur" que si $var est défini comme une valeur non vide tandis que ${var+valeur} sera également évalué comme "valeur" si $var est défini comme une chaîne vide.

Sans [[ -v var ]] ou ${var+valeur}, je pense que vous devrez utiliser une autre méthode. Probablement un test sous-shell tel que décrit dans une réponse précédente :

if ( set -u; echo "$var" ) &> /dev/null; then
    echo "\$var = ${var}
fi

Si la commande "set -u" est déjà active dans votre processus shell, elle le sera également dans le sous-shell sans qu'il soit nécessaire d'utiliser à nouveau "set -u", mais le fait de l'inclure dans la commande du sous-shell permet à la solution de fonctionner également si le processus parent n'a pas activé "set -u".

(Vous pourriez également utiliser un autre processus comme "printenv" ou "env" pour tester la présence de la variable, mais alors cela ne fonctionnerait que si la variable est exportée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X