Je tente d'écrire un achèvement bash pour la première fois, et je suis un peu confus quant aux deux façons de déréférencer les tableaux bash ( ${array[@]}et ${array[*]}).
Voici le morceau de code pertinent (cela fonctionne, au fait, mais j'aimerais mieux le comprendre):
_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} ) )
}
La documentation de bash dit :
Tout élément d'un tableau peut être référencé en utilisant $ {name [indice]}. Les accolades sont nécessaires pour éviter les conflits avec les opérateurs d'extension de nom de fichier du shell. Si l'indice est «@» ou «*», le mot s'étend à tous les membres du nom du tableau. Ces indices ne diffèrent que lorsque le mot apparaît entre guillemets. Si le mot est entre guillemets, $ {name [*]} se développe en un seul mot avec la valeur de chaque membre du tableau séparée par le premier caractère de la variable IFS, et $ {name [@]} développe chaque élément du nom à un mot séparé.
Maintenant, je pense que je comprends que cela compgen -Wattend une chaîne contenant une liste de mots d'alternatives possibles, mais dans ce contexte, je ne comprends pas ce que signifie "$ {name [@]} étend chaque élément de nom à un mot séparé".
Longue histoire courte: ${array[*]}fonctionne; ${array[@]}pas. Je voudrais savoir pourquoi et je voudrais mieux comprendre en quoi consiste exactement ${array[@]}.