Estou escrevendo um script bash que tem set -u
, e tenho um problema com a expansão da matriz vazia: o bash parece tratar uma matriz vazia como uma variável não definida durante a expansão:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arr
também não ajuda.)
Uma solução comum para isso é usar em ${arr[@]-}
vez disso, substituindo assim uma string vazia em vez do array vazio ("indefinido"). No entanto, esta não é uma boa solução, pois agora você não pode discernir entre um array com uma única string vazia e um array vazio. (@ -expansion é especial no bash, ele se expande "${arr[@]}"
para "${arr[0]}" "${arr[1]}" …
, o que o torna uma ferramenta perfeita para construir linhas de comando.)
$ 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
Portanto, há uma maneira de contornar esse problema, além de verificar o comprimento de uma matriz em um if
(veja o exemplo de código abaixo), ou desativar a -u
configuração para esse pequeno pedaço?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Atualização:bugs
Tag removida devido à explicação de ikegami.
"${arr[@]}"
. Estou esquecendo de algo? Pelo que posso ver, funciona pelo menos em5.x
.