「[@]」が bash for ループの変数に何をするか

「[@]」が bash for ループの変数に何をするか

私はGentooのebuildがどのように作成されるのかを調べていて、次のコードを見つけました:

_VIM_PLUGIN_ALLOWED_DIRS=(
    after autoload colors compiler doc ftdetect ftplugin indent keymap
    macros plugin spell syntax
)

local d
for d in "${_VIM_PLUGIN_ALLOWED_DIRS[@]}" "${@}"; do
                [[ -d "${d}" ]] || continue
                doins -r "${d}"
            done 

私が知る限り、_VIM_PLUGIN_ALLOWED_DIRSこれはリストです。dローカル変数です。
私が理解していない[@]ことは_VIM_PLUGIN_ALLOWED_DIRS[@]。通常、私はそれを省略し[@]て値をd繰り返します。_VIM_PLUGIN_ALLOWED_DIRS

何をしていますか?その目的は何ですか?

見たこともなく、次に何をするのか[@]わかりません。${@}

PS:doins他の場所で定義された外部関数です。

事前にありがとう

答え1

通常、[@] を省略し、_VIM_PLUGIN_ALLOWED_DIRS 値を繰り返します。

Bashでも使用できるkshスタイルの配列では、インデックスなしで配列を参照すると、インデックス内の要素のみが提供されます0。これは、インデックスを使用して配列を参照すると、すべての(null以外の)要素が提供されるzshとは異なります。

特別な索引付けは、@配列内のすべての要素を固有フィールドにインポートするために使用されます。$@すべての位置パラメータ(スクリプトまたは関数のパラメータ)に同様に拡張されます。

例えば

arr=(foo "bar doo")
printf "<%s> " "$arr"; echo       # '<foo>'
printf "<%s> " "${arr[@]}"; echo  # '<foo> <bar doo>'

どちらの場合も、値を必然的に混乱させる単語セパレータとワイルドカードを引用して"${arr[@]}"避ける必要があります。"$@"

望むより:

関連情報