Tôi đang cố gắng viết hoàn thành bash lần đầu tiên và tôi hơi bối rối về hai cách truyền tham chiếu mảng bash ( ${array[@]}
và ${array[*]}
).
Đây là đoạn mã có liên quan (nhân tiện, nó hoạt động, nhưng tôi muốn hiểu rõ hơn):
_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} ) )
}
Bất kỳ phần tử nào của một mảng đều có thể được tham chiếu bằng cách sử dụng $ {name [subscript]}. Các dấu ngoặc nhọn được yêu cầu để tránh xung đột với các toán tử mở rộng tên tệp của trình bao. Nếu chỉ số con là '@' hoặc '*', từ này sẽ mở rộng đến tất cả các thành viên của tên mảng. Các chỉ số dưới này chỉ khác nhau khi từ xuất hiện trong dấu ngoặc kép. Nếu từ được đặt trong dấu ngoặc kép, $ {name [*]} sẽ mở rộng thành một từ duy nhất với giá trị của mỗi thành viên mảng được phân tách bằng ký tự đầu tiên của biến IFS và $ {name [@]} mở rộng từng phần tử của tên thành một từ riêng biệt.
Bây giờ tôi nghĩ rằng tôi hiểu điều đó compgen -W
mong đợi một chuỗi chứa danh sách từ gồm các lựa chọn thay thế có thể có, nhưng trong ngữ cảnh này, tôi không hiểu "$ {name [@]} mở rộng từng phần tử của tên thành một từ riêng biệt" nghĩa là gì.
Truyện dài ngắn: ${array[*]}
tác phẩm; ${array[@]}
không. Tôi muốn biết lý do tại sao và tôi muốn hiểu rõ hơn về những gì chính xác ${array[@]}
mở rộng thành.