Sto scrivendo uno script bash che ha set -ue ho un problema con l'espansione dell'array vuoto: bash sembra trattare un array vuoto come una variabile non impostata durante l'espansione:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arrnon aiuta neanche.)
Una soluzione comune a questo è usare ${arr[@]-}invece, sostituendo così una stringa vuota invece dell'array vuoto ("non definito"). Tuttavia questa non è una buona soluzione, poiché ora non è possibile distinguere tra un array con una singola stringa vuota e un array vuoto. (@ -expansion è speciale in bash, si espande "${arr[@]}"in "${arr[0]}" "${arr[1]}" …, il che lo rende uno strumento perfetto per la creazione di righe di 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
Quindi c'è un modo per aggirare questo problema, oltre a controllare la lunghezza di un array in un if(vedere il codice di esempio di seguito) o disattivare l' -uimpostazione per quel pezzo breve?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Aggiornamento:bugs tag rimosso a causa della spiegazione di ikegami.

"${arr[@]}". Mi sto perdendo qualcosa? Da quello che posso vedere funziona almeno in5.x.