Sto provando a scrivere un completamento bash per la prima volta, e sono un po 'confuso riguardo ai due modi di dereferenziare gli array bash ( ${array[@]}
e ${array[*]}
).
Ecco il pezzo di codice rilevante (funziona, a proposito, ma vorrei capirlo meglio):
_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 documentazione di bash dice :
Qualsiasi elemento di un array può essere referenziato usando $ {name [subscript]}. Le parentesi graffe sono necessarie per evitare conflitti con gli operatori di espansione del nome file della shell. Se il pedice è "@" o "*", la parola si espande a tutti i membri del nome dell'array. Questi pedici differiscono solo quando la parola appare tra virgolette doppie. Se la parola è tra virgolette, $ {name [*]} si espande in una singola parola con il valore di ogni membro dell'array separato dal primo carattere della variabile IFS e $ {name [@]} espande ogni elemento di name in una parola separata.
Ora penso di capire che si compgen -W
aspetta una stringa contenente un elenco di parole di possibili alternative, ma in questo contesto non capisco cosa significhi "$ {name [@]} espande ogni elemento del nome in una parola separata".
Per farla breve: ${array[*]}
funziona; ${array[@]}
non lo fa. Vorrei sapere perché e vorrei capire meglio in cosa si ${array[@]}
espande esattamente .