2012-03-15 12 views
32

に別の変数名と変数の値を使用する、の名前が別の変数の値から来ている、と私は次のコードを書いた:どのように変数を宣言したいのbash

a="bbb" 
$a="ccc" 

をしかしそれはうまくいかなかった。この仕事をする正しい方法は何ですか?

答えて

-2

あなたがそうのような他の変数から値を使用して、単純な割り当てを使用して変数に値を割り当てることができます。

#!/usr/bin/bash 

#variable one 
a="one" 

echo "Variable a is $a" 
#variable two with a's variable 
b="$a" 

echo "Variable b is $b" 

#change a 
a="two" 
echo "Variable a is $a" 
echo "Variable b is $b" 

その出力は以下です:

Variable a is one 
Variable b is one 
Variable a is two 
Variable b is one 

だからにしてくださいこれをb = "$ a"のように割り当てて、あなたはすばらしいはずです。

+0

質問は今の表現に固定変数を割り当てる方法をどのように間接的に計算された変数名の際に、あるが。 – Kaz

9

これにはevalを使用できます。
例:

$ a="bbb" 
$ eval $a="ccc" 
$ echo $bbb 
ccc 

・ホープ、このことができます!

41

evalがこれに使用されていますが、あなたがそれを素直に行うと、厄介なエスケープ問題が発生します。この種のものは、一般的に安全である:

name_of_variable=abc 

eval $name_of_variable="simpleword" # abc set to simpleword 

これは壊れる:

eval $name_of_variable="word splitting occurs" 

修正:

eval $name_of_variable="\"word splitting occurs\"" # not anymore 

究極の修正:あなたが変数に割り当てたいテキストを配置します。それをsafevariableとしましょう。次に、これを行うことができます:

eval $name_of_variable=\$safevariable # note escaped dollar sign 

すべてのエスケープ問題を解決します。

eval 'abc=$safevariable' # dollar sign now comes to life inside eval! 

そしてもちろん、この割り当てはすべてのものに免疫がある:ドル記号は、これを効果的に実行しますeval機能、にそのまま生き残っています。これは、のために働くかもしれない

12

safevariableは(ない特別な何か。注意すべき点は、我々はname_of_variableを想定していることであることは、有効な変数名しか含まれていない、と私たちは自由に使用できます1)*、スペース、$、などを含めることができますあなた:

foo=bar 
declare $foo=baz 
echo $bar 
baz 

かこれは:あなたがそれを設定するのではなく、変数の値を取得したい場合は

foo=bar 
read $foo <<<"baz" 
echo $bar 
baz 
+0

正しい、より良い宣言を使用する(セキュリティ上の理由) –

+0

@ meso_2600宣言は、変数のスコープをローカル変数に変更するため、代入と同じように動作しません(変数を変更することはできませんあなたがグローバル変数として宣言しない限り、宣言を伴う親スコープから)。 – niieani

+0

あなたの2番目の答えは素晴らしいです。サブシェルは生成されません。乾杯。 –

3

あなたはこの

を行うことができます
var_name1="var_name2" 
var_name2=value_you_want 
eval temp_var=\$$var_name1 
echo "$temp_var" 

ここでは、indirect referencesについて読むことができます。

25

あなたはこのようdeclare!、使用することができます。

John="nice guy" 
programmer=John 
echo ${!programmer} # echos nice guy 

第二の例:

programmer=Ines 
declare $programmer="nice gal" 
echo $Ines # echos nice gal 
+0

こんにちはFlimm。配列で可能ですか? 'echo '$ {!array [1]}' 'のようなもの? – leaf

関連する問題