J'écris un script bash script qui possède set -u
et j'ai un problème avec l'expansion des tableaux vides : bash semble traiter un tableau vide comme une variable non définie pendant l'expansion :
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arr
n'aide pas non plus.)
Une solution courante consiste à utiliser ${arr[@]-}
à la place, substituant ainsi une chaîne vide au lieu d'un tableau vide ("non défini"). Cependant, ce n'est pas une bonne solution, puisque maintenant vous ne pouvez pas faire la différence entre un tableau contenant une seule chaîne vide et un tableau vide. (@-expansion est spécial en bash, il développe "${arr[@]}"
en "${arr[0]}" "${arr[1]}" …
ce qui en fait un outil parfait pour construire des lignes de commande).
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
Existe-t-il un moyen de contourner ce problème, autre que la vérification de la longueur d'un tableau dans un fichier if
(voir l'exemple de code ci-dessous), ou de désactiver la fonction -u
pour cette courte pièce ?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Mise à jour : Supprimé bugs
tag dû à l'explication de ikegami.