Estoy intentando escribir una finalización de bash por primera vez, y estoy un poco confundido acerca de las dos formas de desreferenciar matrices de bash ( ${array[@]}
y ${array[*]}
).
Aquí está el fragmento de código relevante (funciona, por cierto, pero me gustaría entenderlo mejor):
_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 documentación de bash dice :
Se puede hacer referencia a cualquier elemento de una matriz usando $ {nombre [subíndice]}. Las llaves son necesarias para evitar conflictos con los operadores de expansión de nombre de archivo del shell. Si el subíndice es '@' o '*', la palabra se expande a todos los miembros del nombre de la matriz. Estos subíndices difieren solo cuando la palabra aparece entre comillas dobles. Si la palabra está entre comillas dobles, $ {nombre [*]} se expande a una sola palabra con el valor de cada miembro de la matriz separado por el primer carácter de la variable IFS, y $ {nombre [@]} expande cada elemento del nombre a una palabra separada.
Ahora creo que entiendo que compgen -W
espera una cadena que contenga una lista de palabras de posibles alternativas, pero en este contexto no entiendo qué significa "$ {nombre [@]} expande cada elemento del nombre a una palabra separada".
En pocas palabras: ${array[*]}
funciona; ${array[@]}
no lo hace. Me gustaría saber por qué, y me gustaría entender mejor en qué se ${array[@]}
expande exactamente .