Я пишу скрипт bash, який має set -u, і у мене проблема з розширенням порожнього масиву: схоже, bash обробляє порожній масив як незмінену змінну під час розширення:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
(теж declare -a arrне допомагає.)
Загальним рішенням цього є використання ${arr[@]-}замість цього, замінюючи таким чином порожній рядок замість ("невизначений") порожнього масиву. Однак це не є гарним рішенням, оскільки зараз ви не можете розрізнити між масивом з одним порожнім рядком і порожнім масивом. (@ -expansion є особливим у bash, він розширюється "${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.