Piszę skrypt basha, który ma set -u
i mam problem z rozszerzeniem pustej tablicy: bash wydaje się traktować pustą tablicę jako zmienną nieustawioną podczas rozwijania:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arr
też nie pomaga.)
Typowym rozwiązaniem jest użycie ${arr[@]-}
zamiast tego zastępowania pustego ciągu zamiast („niezdefiniowanej”) pustej tablicy. Nie jest to jednak dobre rozwiązanie, ponieważ teraz nie można odróżnić tablicy zawierającej pojedynczy pusty ciąg znaków od pustej tablicy. (@ -expansion jest specjalne w bash, rozszerza się "${arr[@]}"
do "${arr[0]}" "${arr[1]}" …
, co czyni go idealnym narzędziem do budowania linii poleceń.)
$ 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
Czy jest więc sposób obejścia tego problemu, inny niż sprawdzenie długości tablicy w if
(zobacz przykład kodu poniżej) lub wyłączenie -u
ustawienia dla tego krótkiego fragmentu?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Aktualizacja: Usunięto bugs
tag z powodu wyjaśnienia przez ikegami.
"${arr[@]}"
. Czy coś mi brakuje? Z tego, co widzę, działa przynajmniej w5.x
.