Saya sedang menulis skrip bash yang memiliki set -u, dan saya memiliki masalah dengan ekspansi array kosong: bash tampaknya memperlakukan array kosong sebagai variabel yang tidak disetel selama ekspansi:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arrtidak membantu.)
Solusi umum untuk ini adalah dengan menggunakan ${arr[@]-}sebagai gantinya, dengan demikian menggantikan string kosong sebagai ganti array kosong ("tidak ditentukan"). Namun ini bukan solusi yang baik, karena sekarang Anda tidak dapat membedakan antara sebuah array dengan satu string kosong di dalamnya dan sebuah array kosong. (@ -expansion istimewa dalam bash, ia berkembang "${arr[@]}"menjadi "${arr[0]}" "${arr[1]}" …, yang menjadikannya alat yang sempurna untuk membuat baris perintah.)
$ 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
Jadi apakah ada cara untuk mengatasi masalah itu, selain memeriksa panjang array dalam if(lihat contoh kode di bawah), atau mematikan -upengaturan untuk potongan pendek itu?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Pembaruan:bugs Tag dihapus karena penjelasan oleh ikegami.

"${arr[@]}". Apakah saya melewatkan sesuatu? Dari apa yang saya lihat setidaknya berhasil5.x.