「初心者向けBashガイド」を読んでいます。それは言います:
PARAMETER
の最初の文字が感嘆符である場合、BashはPARAMETER
の残りから形成された変数の値を変数の名前として使用します。その後、この変数は展開され、その値はPARAMETER
自体の値ではなく、残りの置換で使用されます。これは、間接展開として知られています。
例は次のとおりです。
franky ~> echo ${!N*} NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
ここではよくわかりません:
PARAMETER
の残りから形成される変数の値
PARAMETER
はただ!N*
、その後
残りの
PARAMETER
ただN*
。これはどのように変数を形成できますか? Bashはすべての可能なコマンドを検索しましたか?
bash
のmanページを読むと、基本的にあなたが述べたことを確認します:
パラメーターの最初の文字が感嘆符(
!
)の場合、変数の間接化のレベルが導入されます。 Bashは、パラメーターの残りから形成された変数の値を変数の名前として使用します。その後、この変数は展開され、その値はパラメーター自体の値ではなく、残りの置換で使用されます。これは、間接展開として知られています。
ただし、そこから読む:
これの例外は、以下で説明する
${!prefix*}
と${!name[@]}
の拡張です。
${!prefix*}
プレフィックスに一致する名前。名前がprefixで始まる変数の名前に展開され、IFS
特殊変数の最初の文字で区切られます。
つまり、特定の例${!N*}
は、引用したルールのexceptionです。ただし、doesは、次のような予想されるケースでアドバタイズされたとおりに機能します。
$ export xyzzy=plugh ; export plugh=cave
$ echo ${xyzzy} # normal, xyzzy to plugh
plugh
$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave
cave
ここにあるように、与えられた「間接」が*
で終わる場合、例外があるように見えます。この場合、指定した部分(ここではN
)で始まるすべての変数名が与えられます。 Bashは変数を追跡し、どの変数が存在するかを知っているため、これを実行できます。
真の間接指定はこれです:
変数$VARIABLE
を42
に設定し、別の変数$NAME
をVARIABLE
に設定したとします。 ${!NAME}
は42
をくれます。ある変数の値を使用して、別の変数の名前を通知します。
$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42
はい、!の後の変数のすべての可能な展開を検索します。行った場合:
echo ${!NP*}
NPX_PLUGIN_PATH
のみを取得します。
次の例を考えてみましょう。
:~> export myVar="hi"
:~> echo ${!my*}
myVar
:~> export ${!my*}="bye"
:~> echo $myVar
bye
間接処理で例外が発生しました。最後の文字が*
、前に指定されたプレフィックスを持つすべての変数が返されます。
これを参照できますGNU正式な情報についてはbashのドキュメント
しかし、基本的に、例外の1つとして間接展開は${!prefix*}
で実行されません。この例では、Nがプレフィックスです。
このドキュメントでは、bashの間接展開について説明します