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