web-dev-qa-db-ja.com

間接的な拡張とは何ですか? $ {!var *}はどういう意味ですか?

初心者向けBashガイド」を読んでいます。それは言います:

PARAMETERの最初の文字が感嘆符である場合、BashはPARAMETERの残りから形成された変数の値を変数の名前として使用します。その後、この変数は展開され、その値はPARAMETER自体の値ではなく、残りの置換で使用されます。これは、間接展開として知られています。

例は次のとおりです。

franky ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

ここではよくわかりません:

PARAMETERの残りから形成される変数の値

PARAMETERはただ!N*、その後

残りのPARAMETER

ただN*。これはどのように変数を形成できますか? Bashはすべての可能なコマンドを検索しましたか?

68
athos

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
87
paxdiablo

ここにあるように、与えられた「間接」が*で終わる場合、例外があるように見えます。この場合、指定した部分(ここではN)で始まるすべての変数名が与えられます。 Bashは変数を追跡し、どの変数が存在するかを知っているため、これを実行できます。

真の間接指定はこれです:
変数$VARIABLE42に設定し、別の変数$NAMEVARIABLEに設定したとします。 ${!NAME}42をくれます。ある変数の値を使用して、別の変数の名前を通知します。

$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42
19
Kevin

はい、!の後の変数のすべての可能な展開を検索します。行った場合:

echo ${!NP*}

NPX_PLUGIN_PATHのみを取得します。

次の例を考えてみましょう。

:~> export myVar="hi"
:~> echo ${!my*}
    myVar
:~> export ${!my*}="bye"
:~> echo $myVar
    bye
3
tpg2114

間接処理で例外が発生しました。最後の文字が*、前に指定されたプレフィックスを持つすべての変数が返されます。

これを参照できますGNU正式な情報についてはbashのドキュメント

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

しかし、基本的に、例外の1つとして間接展開は${!prefix*}で実行されません。この例では、Nがプレフィックスです。

このドキュメントでは、bashの間接展開について説明します

0
Margach Chris