Bash расширение пустого массива с `set -u`

Я пишу сценарий bash, который имеет set -u, и у меня проблема с расширением пустого массива: bash считает пустой массив несмещенной переменной при расширении:

$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable

(declare -a arr тоже не помогает. )

Обычным решением этой проблемы является использование ${arr[@]-} вместо этого, таким образом подставляя пустую строку вместо ("неопределенного") пустого массива. Однако это не лучшее решение, поскольку теперь вы не сможете отличить массив с одной пустой строкой от пустого массива. (@-расширение является специальным в 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.

89
задан Ivan Tarasov 28 September 2011 в 04:53
поделиться