J'apprends à utiliser efficacement différentes set
options dans mon script et je suis tombé sur ce set -u
qui semble être parfait pour quitter mon script si une variable n'est pas définie correctement (par exemple, supprimer des utilisateurs). Selon l' homme page set -u
et set -e
fait ce qui suit ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
J'ai créé un script de test pour tester cette fonctionnalité, mais il ne semble pas fonctionner comme prévu. Peut-être que quelqu'un pourrait mieux m'expliquer mon problème et où je fais une mauvaise interprétation? Le script de test est ci-dessous. Je vous remercie.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Je m'attends à ce que le script affiche 0 et "Cela fonctionne" , puis échoue car il ${testing2}
n'est pas défini.
Au lieu de cela, je suis affiché 0 et "Cela fonctionne" , suivi de 0 puis de 0 Cela ne devrait pas apparaître
Quelqu'un peut-il fournir des connaissances? Je vous remercie.
la source
Réponses:
De "l'homme Bash":
Lorsque vous le faites,
testing2=
vous définissez la variable sur la chaîne nulle.Remplacez-le par
unset testing2
et réessayez.Le
set -e
n'aide pas dans ce cas car une affectation n'a jamais de code de sortie de 1. Essayez ceci pour voir que la dernière commande exécutée (l'affectation) a un code de sortie de 0, ou lisez cette question :Et je crois aussi que l'utilisation de set -e est plus un problème qu'une solution.
Ce qui peut obtenir une erreur avec l'utilisation de variables non définies est
set -u
:Sortira:
la source
testing2=
définit latesting2
variable sur une chaîne vide; la variable est en fait définie .Cependant, si vous deviez exécuter
echo $testing99
dans un shell Bash interactif (sans paramètreerrexit
, c'est-à-direset -e
), vous obtiendriez une erreur:De côté
En testant les scripts tout à l'heure, j'ai découvert qu'un shell interactif ne se ferme pas toujours lorsque l'on tente de développer une variable qui n'a pas été définie alors qu'un shell non interactif (exécutant un script shell) se ferme toujours . Selon la page de manuel POSIX pour
set
:Un shell Bash interactif ne se fermera que s'il
errexit
a également été défini. D'un autre côté, un shell de tableau de bord interactif ne sortira pas - même s'ilset -e
a déjà été exécuté.la source