Je voudrais m'assurer qu'à un certain point d'un script, après avoir source
créé un fichier de configuration, plusieurs variables sont définies et, si ce n'est pas le cas, arrêter l'exécution en informant l'utilisateur de la variable manquante. j'ai essayé
for var in $one $two $three ; do
...
mais si par exemple $two
n'est pas défini, la boucle n'est jamais exécutée pour $two
. La prochaine chose que j'ai essayée était
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
Mais si deux n'est pas défini, je reçois toujours "deux est défini sur" au lieu de "deux n'est pas défini".
Comment puis-je m'assurer que toutes les variables requises sont définies?
Mise à jour / Solution: je sais qu'il y a une différence entre "set" et "set, but empty". J'utilise maintenant (grâce à /programming//a/16753536/3456281 et les réponses à cette question) les éléments suivants:
if [ -n "${!var:-}" ] ; then
ainsi, s'il var
est défini mais vide, il est toujours considéré comme invalide.
la source
set -u
au début de votre script pour le terminer immédiatement lorsqu'une variable non définie est utilisée.Réponses:
Erreur de citation.
Pour l'avenir: le cadre
avant d'exécuter le code vous aurait montré le problème. Au lieu d'ajouter cela au code, vous pouvez appeler votre script avec
la source
set -- $(IFS=, ; echo $cs)
? Le genre de personnes qui doivent demander ici pourquoiif [ -n ${!var} ] ; then
ne fonctionne pas? Probablement pas.La seule chose dont vous avez besoin sont des citations dans votre test:
Travaille pour moi.
la source
Si vous voulez que le programme soit arrêté:
Ça fera l'affaire. Chacun des messages suivant le point d'interrogation est imprimé
stderr
et le shell parent meurt. Eh bien, OK, donc pas chaque message - un seul - juste le premier qui échoue imprime un message car le shell meurt. J'aime utiliser ces tests comme ceci:J'avais beaucoup plus à dire à ce sujet ici .
la source
Vous pouvez ajouter
au début de votre script pour qu'il se termine lorsqu'il essaie d'utiliser une variable non définie.
Un script comme
aura pour résultat
Si vous utilisez à la
bash
place, l'erreur ressemblera à ceci:la source
set -u
empêche exactement le type d'erreur que l'OP essaie d'éviter et (contrairement à toutes les autres solutions) ne se limite pas à un ensemble spécifique de variables. C'est en fait une précaution utile pour presque tous les scripts shell de les faire échouer en toute sécurité au lieu de faire des choses inattendues lorsqu'une variable n'est pas définie. Cet article est une référence pratique sur le sujet.set -u
pourrait être utilisé aussi je pense, mais ce n'est pas aussi flexible que l'expansion des paramètres appropriée (voir ma question mise à jour). Et avecset -u
je devrais faire un faux accès à toutes les variables cibles si je veux vérifier leur présence en un seul endroit.Une solution qui est au maximum conviviale teste toutes les exigences et les signale ensemble, plutôt que d'échouer à la première et d'exiger des allers-retours pour bien faire les choses:
J'utilise une variable de tableau pour suivre les variables qui n'ont pas été définies et j'utilise le résultat pour composer un message utilisateur.
Remarques:
${required_vars[@]}
dans lafor
boucle principalement par habitude - je ne conseillerais pas d'inclure des métacaractères shell dans vos noms de variables!${#missing_vars[@]}
, car c'est toujours un entier, même si vous êtes assez pervers pour ignorer les conseils précédents.%q
lors de l'impression;%s
serait normalement suffisant.>&2
, donc elle n'est pas redirigée vers les commandes en avalla source
bash
4.2 vous permet de tester si une variable est définie avec l'-v
opérateur; une variable non définie et une variable définie sur la chaîne vide sont deux conditions différentes:la source
-v
prend le nom d'une variable, doncfor var in one two three; [[ -v $var ]] && ...; done
vérifierait si chacunone
,two
etthree
sont situés dans la séquence.Je pense que si vous voulez dire
not set
, la variable ne doit donc jamais être initialisée. Si vous utilisez[ -n "${!var}" ]
, la variable vide commetwo=""
échouera alors qu'elle est définie . Vous pouvez essayer ceci:la source
Une solution concise (quoique légèrement hacky), pour gérer le cas où le
source
script d peut définir les variables sur une valeur nulle, consiste à initialiser les variables à une valeur spéciale avant de rechercher le script, puis à vérifier cette valeur par la suite , par exemplela source
J'ai étendu la réponse de @ mikeserv .
Cette version prend une liste de variables pour vérifier la présence de, imprimant le nom de la variable manquante et déclenchant un appel à usage () en cas d'erreur.
Exemple de sortie lorsqu'une valeur est manquante:
Notez que vous pouvez changer la variable appelée VALUE en un autre nom qui convient mieux à la sortie souhaitée.
la source