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 -W
attend 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[@]}
.