私は初めてbashの補完を書くことに挑戦していますが、bash配列(${array[@]}
と${array[*]}
)を逆参照する2つの方法について少し混乱しています。
これが関連するコードのチャンクです(ちなみに、それは機能しますが、もっとよく理解したいと思います):
_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 [@]}は名前の各要素を展開します別の言葉に。
これでcompgen -W
、可能な代替の単語リストを含む文字列が必要であることは理解できたと思いますが、このコンテキストでは、「$ {name [@]}が名前の各要素を個別の単語に展開する」とはどういう意味かわかりません。
短編小説:${array[*]}
作品; ${array[@]}
そうではありません。その理由を知りたいのですが、正確に何が${array[@]}
拡大するのかをよりよく理解したいと思います。