İçerdiği bir bash betiği yazıyorum set -uve boş dizi genişletmesiyle ilgili bir sorunum var: bash, genişletme sırasında boş bir diziyi ayarlanmamış bir değişken olarak ele alıyor görünüyor:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arrda yardımcı olmuyor.)
Bunun yaygın bir çözümü, ${arr[@]-}bunun yerine kullanmaktır , böylece boş diziyi ("tanımsız") boş dizi yerine boş bir dizge kullanmaktır. Ancak bu iyi bir çözüm değildir, çünkü artık içinde tek bir boş dizge olan bir dizi ile boş bir dizi arasında ayrım yapamazsınız. (@ -expansion, bash için özeldir, "${arr[@]}"içine genişler "${arr[0]}" "${arr[1]}" …, bu da onu komut satırları oluşturmak için mükemmel bir araç yapar.)
$ 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
Öyleyse, bir dizideki bir dizinin uzunluğunu kontrol etmekten if(aşağıdaki kod örneğine bakın) veya -ubu kısa parça için ayarı kapatmaktan başka bir yolu var mı?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Güncelleme:bugs İkegami'nin açıklaması nedeniyle kaldırılan etiket.

"${arr[@]}". Bir şey mi kaçırıyorum? Görebildiğim kadarıyla en azından içinde çalışıyor5.x.