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