Я пишу сценарий 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.