Я впервые пытаюсь написать завершение 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[@]}
расширяется.