İlk kez bir bash tamamlama yazarken bir deneme yapıyorum ve bash dizilerini ( ${array[@]}
ve ${array[*]}
) referanslarını kaldırmanın iki yolu hakkında biraz kafam karıştı .
İşte ilgili kod parçası (bu arada işe yarıyor, ama ben onu daha iyi anlamak istiyorum):
_switch()
{
local cur perls
local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
perls=($ROOT/perls/perl-*)
# remove all but the final part of the name
perls=(${perls[*]##*/})
COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
Bash'in belgeleri şunu söylüyor :
Bir dizinin herhangi bir öğesi $ {isim [indis]} kullanılarak belirtilebilir. Kaşlı ayraçlar, kabuğun dosya adı genişletme işleçleriyle çakışmaları önlemek için gereklidir. Alt simge '@' veya '*' ise, kelime dizi adının tüm üyelerine genişler. Bu alt simgeler, yalnızca sözcük çift tırnak içinde göründüğünde farklılık gösterir. Sözcük çift tırnak içine alınmışsa, $ {isim [*]}, IFS değişkeninin ilk karakteriyle ayrılmış her bir dizi üyesinin değeri ile tek bir kelimeye genişler ve $ {isim [@]}, ismin her bir öğesini genişletir ayrı bir kelimeye.
Şimdi bunun compgen -W
olası alternatiflerden oluşan bir kelime listesi içeren bir dizge beklediğini anladığımı düşünüyorum , ancak bu bağlamda "$ {ad [@]} adın her bir öğesini ayrı bir kelimeye genişletir" in ne anlama geldiğini anlamıyorum.
Uzun lafın kısası: ${array[*]}
işler; ${array[@]}
değil. Nedenini bilmek isterim ve tam olarak neye ${array[@]}
genişlediğini daha iyi anlamak isterim .