Je suis en train de rédiger un Bash pour la première fois, et je suis un peu confus au sujet des deux façons de déréférencer les tableaux Bash (${array[@]}
et ${array[*]}
).
Voici le morceau correspondant du code (cela fonctionne, en passant, mais je voudrais comprendre mieux):
_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}))
}
documentation says de Bash:
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'expansion de nom de fichier du shell. Si l'indice est '@' ou '*', le mot s'étend à tous les membres du nom de tableau. Ces indices diffèrent seulement 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é par le premier caractère de la variable IFS, et $ {name [@]} étend chaque élément du nom à un mot séparé.
Maintenant, je pense que je comprends que compgen -W
attend une chaîne contenant une liste de mots d'alternatives possibles, mais dans ce contexte, je ne comprends pas ce que « $ {nom [@]} élargit chaque élément de nom en un mot distinct " veux dire.
Longue histoire courte: ${array[*]}
fonctionne; ${array[@]}
ne fait pas. Je voudrais savoir pourquoi, et je voudrais mieux comprendre ce que exactement ${array[@]}
se développe dans.
C'est excellent; Merci. J'aimerais vraiment que ça éclate plus fort, mais cela clarifie au moins pourquoi cela n'a pas fonctionné. – Telemachus