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
感嘆符(!
)であり、PARAMETER
NAMEREFでない場合は、フェーズ1変数間接指定を導入します。。 Bash は、残りの部分から形成された変数の値をPARAMETER
変数名として使用し、変数を拡張し、それPARAMETER
自体の値ではなく、残りの置換でその値を使用します。これを「間接拡張」といいます。 namerefの場合は、間接拡張全体を実行するのではなく、参照された変数PARAMETER
の名前を拡張します。PARAMETER
以下に説明する拡張は例外です${!PREFIX*}
。${!NAME[@]}
感嘆符は、間接的な関係を紹介するために開く中括弧の直後になければなりません。
あなたの便宜のために、ドキュメントのこのセクションを見つけることができます。GNU.org ドキュメントサイトからまた。