2017-06-19 4 views
0

名前と値の両方が別のコマンドの出力から得られるbashシェルスクリプトで変数を宣言する必要があります。bashの `declare`でコマンドの出力から名前と値を取る変数を設定するには?

この質問のために、私は一時ファイルtmp使用します。

$ cat tmp 
var1="hello world" 
var2="1" 

を...と、以下の私のモックのコマンドのためにそれを使用します。最後に

は、私は、入力から直接取得変数名var1var2で、それぞれhello world1で変数$var1$var2セットを持っている必要があります。ここで

は、私がこれまでに得たものである:

$ cat tmp|while read line; do declare $line; done 

私はcatを使用する必要はありませんが、これは、入力は、他のコマンドの出力から取られているという事実をシミュレートすることで、知りませんファイルに保存します。

これは機能しません。私が取得:

bash: declare: `world"': not a valid identifier 

$ echo $var1; echo $var2 


$ 

私はこれを行うことができますので、これが動作しない理由を私は理解していない:

declare var1="hello world" 

を期待される結果と...。私はこれが同等であると仮定しましたが、私は明らかに間違っています。

私はthis answerを私の問題に最も近いものとして見つけましたが、それはソースファイルに依存しているからです。私はそれを避けたいと思います。私はevalを使用して他の答えを見つけましたが、私もそれを避けることを好むでしょう。

多分私は理解していない引用符の使用に微妙なことがあります。

唯一の方法は、一時ファイルを使用してソースを作成することですが、それは私がやることですが、別の方法が必要だと思います。

答えて

0

シェルスクリプトを書くときは、常に変数を二重引用符で囲むことをお勧めします。それ以外の場合は、シェルの単語分割の影響を受けます。

while read line; do 
    declare "$line" 
done < <(echo "var1=hello world") 

なぜecho "var1=hello world" | while read line; do export "$line"; doneは機能しませんか? pipesub-shellであるため、サブシェルvar1を作成しても、現在のシェルには影響しません。したがって、現在のシェルにを設定することはできません

代わりにprocess substitutionを使用すると、出力を一時ファイルとして取得できます。したがって、現在のシェルに変数が作成されます。

+0

OPが(サブシェルで実行している)スクリプトを実行する場合、これはまだ解決しません – Inian

+0

OK、それはサブシェルでは機能しません。 @Inian。 – zhenguoli

+0

@zhenguoliこれは、1)外部ファイルに依然として依存している、2)変数の値に "="記号がある場合は動作しないので、これは疑問に答えるのが怖いです。 – Jordan

関連する問題