Я начинаю записывать завершение Bash в первый раз, и я немного запутался в двух способах разыменования массивов 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} ) )
}
Bash документация говорит:
Любой элемент массива может ссылаться на ${name [subscript]}. Скобки необходимы, чтобы избежать конфликтов с операторами расширения файлов оболочки. Если индексом является "@" или "*", слово расширяется до всех членов имени массива. Эти индексы отличаются только тогда, когда слово появляется в двойных кавычках. Если слово double-quoted, ${name [*]} расширяется до одного слова со значением каждого элемента массива, разделенным первым символом переменной IFS, а ${name [@]} расширяет каждый элемент имени к отдельному слову.
Теперь я думаю, что я понимаю, что compgen -W
ожидает строку, содержащую список слов возможных альтернатив, но в этом контексте я не понимаю, что "$ {name [@]} расширяет каждый элемент имени до отдельного слова" означает.
Короче говоря: ${array[*]}
работает; ${array[@]}
нет. Я хотел бы знать, почему, и я хотел бы лучше понять, что именно ${array[@]}
расширяется.