Piszę skrypt basha, który ma set -ui 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 arrteż 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 -uustawienia dla tego krótkiego fragmentu?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Aktualizacja: Usunięto bugstag z powodu wyjaśnienia przez ikegami.

"${arr[@]}". Czy coś mi brakuje? Z tego, co widzę, działa przynajmniej w5.x.