ฉันรู้สึกสับสนในการเขียน 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[@]}
ขยายออกไป