Я пишу сценарий bash, который имеет set -u, и у меня проблема с расширением пустого массива: кажется, что bash обрабатывает пустой массив как неустановленную переменную во время расширения:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arrтоже не помогает.)
Обычным решением этой проблемы является использование ${arr[@]-}вместо нее пустой строки вместо ("неопределенного") пустого массива. Однако это не очень хорошее решение, так как теперь вы не можете отличить массив с одной пустой строкой от пустого массива. (@ -разложение особенное в Баше, он расширяется "${arr[@]}"в "${arr[0]}" "${arr[1]}" …, что делает его идеальным инструментом для построения командной строки.)
$ 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
Есть ли способ обойти эту проблему, кроме проверки длины массива в if(см. Образец кода ниже) или отключения -uнастройки для этого короткого фрагмента?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Обновление: удален bugsтег из-за объяснения ikegami.

"${arr[@]}". Я что-то упускаю? Насколько я могу судить, он работает по крайней мере в5.x.