私は初めて bash 補完を書くことに挑戦しています。bash 配列を逆参照する 2 つの方法 (${array[@]}
および${array[*]}
) について少し混乱しています。
関連するコードのチャンクは次のとおりです(ちなみに、動作しますが、もっとよく理解したいと思います):
_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} ) )
}
bashのドキュメントには次のように書かれています:
${name[subscript]} を使用して、配列の任意の要素を参照できます。中括弧は、シェルのファイル名展開演算子との競合を避けるために必要です。添え字が '@' または '*' の場合、単語は配列名のすべてのメンバーに展開されます。これらの添え字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合、${name[*]} は各配列メンバーの値が IFS 変数の最初の文字で区切られた単一の単語に展開され、${name[@]} は name の各要素を展開します別の言葉に。
compgen -W
これで、可能な選択肢の単語リストを含む文字列が期待されることは理解できたと思いますが、このコンテキストでは、「${name[@]} は name の各要素を個別の単語に展開する」という意味がわかりません。
簡単に言え${array[*]}
ば、動作します。${array[@]}
しません。その理由を知りたいのですが、正確に何が${array[@]}
展開されるのかをよりよく理解したいと思います。