Je m'essaye pour la première fois à l'écriture d'une complétion en bash, et je suis un peu confus à propos des deux façons de déréférencer les tableaux en bash ( ${array[@]}
y ${array[*]}
).
Voici le morceau de code correspondant (il fonctionne, 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} ) )
}
de bash la documentation dit :
Tout élément d'un tableau peut être référencé en utilisant ${nom[indice]}. Les accolades sont nécessaires pour éviter les conflits avec les opérateurs d'expansion de nom de fichier de l'interpréteur de commandes. Si l'indice est "@" ou "*", le mot est étendu à tous les membres du nom du tableau. Ces indices ne diffèrent que lorsque le mot apparaît entre guillemets doubles. Si le mot est entre guillemets doubles, ${nom[*]} 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 ${nom[@]} développe chaque élément de nom en un mot distinct.
Je crois que je comprends maintenant que compgen -W
attend une chaîne contenant une liste de mots possibles, mais dans ce contexte, je ne comprends pas ce que signifie "${nom[@]} développe chaque élément de nom en un mot distinct".
Pour faire court : ${array[*]}
œuvre ; ${array[@]}
ne le fait pas. J'aimerais savoir pourquoi, et je voudrais mieux comprendre ce qu'est exactement l'action de l'Union européenne. ${array[@]}
se développe en.