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