${!i}をどのように解析しますか(そしてその意味は何ですか)? [コピー]

${!i}をどのように解析しますか(そしてその意味は何ですか)? [コピー]

forループの本文で${!i}次の形式が見つかりました。

for ((i=$#; i>0; i--)); do
    # ...
    if <SOME_TEST>; then
        # ...
        accumulator="${!i}:${accumulator}"
        # ...
    fi
    # ...
done

${!i}これらの可能な値の範囲を考慮すると、これは「i最初の位置引数に拡張」を意味するようです。

とにかく、私はこのシンボルについてもっと知りたいです。 (特に${!i}特別な場合なのか$@、それともどの配列にも適用される構文の特定のインスタンスなのか?だから式がどのように構文解析されるのか気になります。)

ただし、このシンボルのドキュメントが見つかりません。bashこのシーケンスのマニュアルページを検索すると、次の文字列のみが検索${!されます。

   ${!name[@]}
   ${!name[*]}
   ${!prefix*}
   ${!prefix@}

...そして、これらのイベントに関連する文書を私が混同しているコードと一致させることはできません。

(実際に可能であれば、回答に関連文書を引用して、私が見逃した理由を理解できるようにしてください。)


編集:元の投稿の場合、元のforコードから誤った行をコピーしました。今修正しました。 (説明は同じですが。)

ベストアンサー1

あなたの家は正しいです。

詳細な文書は次の場所に隠されていますinfo bash

3.5.3 シェルパラメータの拡張

[...]

パラメータ拡張の基本形式はです${PARAMETER}。値が PARAMETER置き換えられます。これはPARAMETER、上記のようにシェルパラメータ(*note ShellParameters::)または配列参照(*note Arrays::)です。PARAMETER位置引数に複数の数字がある場合、または名前の一部として解釈されない文字が続く場合は、中PARAMETER括弧が必要です。

の最初の文字がPARAMETER感嘆符(!)であり、 PARAMETERNAMEREFでない場合は、フェーズ1変数間接指定を導入します。。 Bash は、残りの部分から形成された変数の値をPARAMETER変数名として使用し、変数を拡張し、それPARAMETER自体の値ではなく、残りの置換でその値を使用します。これを「間接拡張」といいます。 namerefの場合は、間接拡張全体を実行するのではなく、参照された変数PARAMETERの名前を拡張します。PARAMETER以下に説明する拡張は例外です${!PREFIX*}${!NAME[@]}感嘆符は、間接的な関係を紹介するために開く中括弧の直後になければなりません。

あなたの便宜のために、ドキュメントのこのセクションを見つけることができます。GNU.org ドキュメントサイトからまた。

おすすめ記事