Po raz pierwszy próbuję napisać zakończenie basha i jestem trochę zdezorientowany co do dwóch sposobów dereferencji tablic bash ( ${array[@]}
i ${array[*]}
).
Oto odpowiedni fragment kodu (nawiasem mówiąc, działa, ale chciałbym to lepiej zrozumieć):
_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} ) )
}
dokumentacja basha mówi :
Do każdego elementu tablicy można się odwołać za pomocą $ {nazwa [wskaźnik]}. Nawiasy są wymagane, aby uniknąć konfliktów z operatorami rozwijania nazw plików w powłoce. Jeśli indeksem dolnym jest „@” lub „*”, słowo jest interpretowane na wszystkie elementy nazwy tablicy. Te indeksy różnią się tylko wtedy, gdy słowo występuje w cudzysłowie. Jeśli słowo jest umieszczone w cudzysłowie, $ {name [*]} rozwija się do pojedynczego słowa z wartością każdego elementu tablicy oddzieloną pierwszym znakiem zmiennej IFS, a $ {name [@]} rozszerza każdy element nazwy do osobnego słowa.
Teraz myślę, że rozumiem, że compgen -W
oczekuje łańcucha zawierającego listę słów z możliwymi alternatywami, ale w tym kontekście nie rozumiem, co oznacza „$ {nazwa [@]} rozszerza każdy element nazwy do osobnego słowa”.
Krótko mówiąc: ${array[*]}
prace; ${array[@]}
nie. Chciałbym wiedzieć dlaczego i chciałbym lepiej zrozumieć, co dokładnie się ${array[@]}
rozszerza.