ฉันรู้สึกสับสนในการเขียน bash เสร็จเป็นครั้งแรกและฉันสับสนเล็กน้อยเกี่ยวกับสองวิธีในการยกเลิกการอ้างอิงอาร์เรย์แบช (${array[@]}และ${array[*]})
นี่คือส่วนของรหัสที่เกี่ยวข้อง (มันใช้งานได้ แต่ฉันอยากจะเข้าใจให้ดีขึ้น):
_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} ) )
}
องค์ประกอบใด ๆ ของอาร์เรย์สามารถอ้างอิงได้โดยใช้ $ {name [subscript]} ต้องใช้วงเล็บปีกกาเพื่อหลีกเลี่ยงความขัดแย้งกับตัวดำเนินการขยายชื่อไฟล์ของเชลล์ ถ้าตัวห้อยเป็น '@' หรือ '*' คำนั้นจะขยายไปยังสมาชิกทั้งหมดของชื่ออาร์เรย์ ตัวห้อยเหล่านี้จะแตกต่างกันก็ต่อเมื่อคำนั้นปรากฏภายในเครื่องหมายคำพูดคู่ ถ้าคำนั้นยกมาสองครั้ง $ {name [*]} จะขยายเป็นคำเดียวโดยมีค่าของสมาชิกอาร์เรย์แต่ละตัวคั่นด้วยอักขระตัวแรกของตัวแปร IFS และ $ {name [@]} จะขยายแต่ละองค์ประกอบของชื่อ เป็นคำแยก
ตอนนี้ฉันคิดว่าฉันเข้าใจแล้วว่าcompgen -Wคาดว่าจะมีสตริงที่มีรายการคำของทางเลือกที่เป็นไปได้ แต่ในบริบทนี้ฉันไม่เข้าใจว่า "$ {name [@]} ขยายแต่ละองค์ประกอบของชื่อเป็นคำแยกกัน" หมายถึงอะไร
เรื่องสั้น: ${array[*]}ผลงาน; ${array[@]}ไม่ ฉันต้องการทราบสาเหตุและฉันต้องการทำความเข้าใจให้ดีขึ้นว่าอะไรคือสิ่งที่${array[@]}ขยายออกไป