J'écris un script bash qui a set -u
, et j'ai un problème avec l'expansion de tableau vide: 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 à cela est d'utiliser à la ${arr[@]-}
place, substituant ainsi une chaîne vide au lieu du tableau vide ("indéfini"). Cependant, ce n'est pas une bonne solution, car maintenant vous ne pouvez pas discerner entre un tableau contenant une seule chaîne vide et un tableau vide. (@ -expansion est spécial en bash, il se dilate "${arr[@]}"
dans "${arr[0]}" "${arr[1]}" …
, ce qui en fait un outil idéal pour la construction de 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 donc un moyen de contourner ce problème, autre que de vérifier la longueur d'un tableau dans un if
(voir l'exemple de code ci-dessous), ou de désactiver le -u
paramètre pour ce petit morceau?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Mise à jour:bugs
balise supprimée en raison de l'explication d'ikegami.
"${arr[@]}"
. Est-ce que je manque quelque chose? D'après ce que je peux voir, cela fonctionne au moins5.x
.