2012-04-25 8 views
8

私はこの1つで私の頭を傷つけている、それについて話しているbashのリファレンスを見つけることができません。

host_color=${uphost}_host_color 
host_color=${!host_color} 

次のコードで

は、2行目は何をしているのですか?この場合、!演算子は何をしますか? B ash manualから

答えて

6

これはindirect referencesの略語です。

$ foo=bar 
$ bar=bas 
$ echo ${!foo} 
bas 

一見同様の構成${!foo*}に名前fooので始まるすべての変数の名前を以下のように拡張します

$ foo1=x 
$ foo2=y 
$ echo ${!foo*} 
foo1 foo2 
+0

あなたはそれを持って、ありがとう。これで完全な意味合いが得られます。host_color = green、緑色は色分けされた変数です。 –

+0

+1オリバーのコードが何をしているかのようです。基本的に 'host_color'を' $ {uphost} _host_color'の値に設定します。 '$ {$ {uphost} _host_color} 'に設定しても変わりません。 –

1

:(!)

パラメータの最初の文字が感嘆符である場合は、変数間接の レベルが導入されます。 Bashは の値を残りのパラメータから形成された変数を 変数の名前として使用します。この変数は展開され、その値はパラメータ自体の値ではなく、置換の残りの部分に使用されます。 これは間接的な拡張と呼ばれます。例外は、以下で説明する$ {!prefix *}と$ {!name [@]}を展開した です。

+1

は$ {!}接頭辞と同じ$ {!プレフィックス*}のですか? –

+0

オリバー氏の投稿には「*」や「@」がないので、マンページの次のエントリーと思っていました: '$ {!name [@]}' '** name **が配列** name **が配列でない場合、** name **が設定されている場合は0に展開されます。 –

+0

@Olivier:いいえ、それらは同じではありません。私はbashマニュアルから関連するビットを追加しました。 –