1. ホーム
  2. bash

[解決済み] 間接拡張とは何ですか?var*}の意味は何ですか?

2023-02-07 11:21:22

質問

を読んでいます。 初心者のための Bash ガイド を読んでいます。 と書いてあります。

の最初の文字が PARAMETER の最初の文字が感嘆符の場合、Bash は PARAMETER の残りの部分から形成された変数の値を変数名として使います。この変数は展開され、その値が残りの置換で使われ、むしろ PARAMETER の値そのものではなく、その値が残りの代入に使われる。これは間接展開と呼ばれています。

与えられた例では

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

ここがよくわからない。

の残りの部分から形成される変数の値です。 PARAMETER

のように PARAMETER は単に !N* であり、次に

その他 PARAMETER

は、ただ N* . これがどうして変数になるのでしょうか? Bashはそこに可能なすべてのコマンドを検索しましたか?

どのように解決するには?

もし、あなたが bash のマニュアルページを読むと、基本的にあなたが述べていることを確認しています。

パラメータの最初の文字が感嘆符である場合 ( ! ) の場合、変数のインダイレクトレベルが導入されます。 Bash はパラメータの残りの部分から形成された変数の値を変数名として使用します。この変数は次に展開され、その値はパラメータの値自体ではなく、置換の残りの部分で使用されます。 これは間接展開と呼ばれています。

しかし、そこから先を読むと

の拡張は例外です。 ${!prefix*}${!name[@]} である。

${!prefix*} prefixに一致する名前。の最初の文字で区切られたprefixで始まる変数の名前に展開する。 IFS という特殊な変数の最初の文字で区切られた、prefixで始まる名前の変数名に展開する。

言い換えれば、あなたの特定の例 ${!N*} 例外 であり、引用されたルールの それは しかし、次のような期待されるケースでは広告のように機能します。

$ export xyzzy=plugh ; export plugh=cave

$ echo ${xyzzy}  # normal, xyzzy to plugh
plugh

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave
cave