Saya mencoba menulis penyelesaian bash untuk pertama kalinya, dan saya agak bingung tentang dua cara dereferensi bash array ( ${array[@]}
dan ${array[*]}
).
Berikut potongan kode yang relevan (ngomong-ngomong, berfungsi, tetapi saya ingin memahaminya dengan lebih baik):
_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} ) )
}
Dokumentasi bash mengatakan :
Setiap elemen dari sebuah array dapat direferensikan menggunakan $ {name [subscript]}. Kawat gigi diperlukan untuk menghindari konflik dengan operator perluasan nama file shell. Jika subskripnya adalah '@' atau '*', kata tersebut akan meluas ke semua anggota nama array. Subskrip ini hanya berbeda jika kata tersebut muncul dalam tanda kutip ganda. Jika kata tersebut dikutip ganda, $ {name [*]} diperluas menjadi satu kata dengan nilai setiap anggota array dipisahkan oleh karakter pertama variabel IFS, dan $ {name [@]} memperluas setiap elemen nama ke kata terpisah.
Sekarang saya pikir saya mengerti bahwa compgen -W
mengharapkan string yang berisi daftar kata dari kemungkinan alternatif, tetapi dalam konteks ini saya tidak mengerti apa arti "$ {name [@]} memperluas setiap elemen nama menjadi kata terpisah".
Singkat cerita: ${array[*]}
karya; ${array[@]}
tidak. Saya ingin tahu alasannya, dan saya ingin lebih memahami apa sebenarnya ${array[@]}
perluasan itu.