Estou tentando escrever uma conclusão de bash pela primeira vez e estou um pouco confuso sobre as duas maneiras de desreferenciar matrizes de bash ( ${array[@]}
e${array[*]}
).
Aqui está o trecho de código relevante (funciona, a propósito, mas gostaria de entendê-lo melhor):
_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} ) )
}
A documentação do bash diz :
Qualquer elemento de um array pode ser referenciado usando $ {name [subscript]}. As chaves são necessárias para evitar conflitos com os operadores de expansão de nome de arquivo do shell. Se o subscrito for '@' ou '*', a palavra se expandirá para todos os membros do nome da matriz. Esses subscritos diferem apenas quando a palavra aparece entre aspas duplas. Se a palavra estiver entre aspas duplas, $ {name [*]} se expande para uma única palavra com o valor de cada membro da matriz separado pelo primeiro caractere da variável IFS, e $ {name [@]} expande cada elemento do nome para uma palavra separada.
Agora acho que entendo que compgen -W
espera uma string contendo uma lista de palavras de alternativas possíveis, mas neste contexto eu não entendo o que "$ {name [@]} expande cada elemento do nome para uma palavra separada" significa.
Resumindo: ${array[*]}
obras; ${array[@]}
não. Eu gostaria de saber por que e de entender melhor o que exatamente se ${array[@]}
expande.