2016-11-19 19 views
0

私はちょうどbash関数で苦労しています。は文字列値を返しますが、一部のグローバル変数は関数で修正されています。例:グローバル変数が影響を受けることはありませんので、$(...)(とも `...`が代わりに使用されている場合)、独自の環境を持っている機能を引き起こすためBash関数は値を返す一方で、グローバル変数を変更します

MyGlobal="some value" 

function ReturnAndAlter() { 
    MyGlobal="changed global value" 
    echo "Returned string" 
} 

str=$(ReturnAndAlter) 
echo $str   # prints out 'Returned value' as expected 
echo $MyGlobal  # prints out the initial value, not changed 

これがあります。

値を別のグローバル変数に戻し、その名前だけを使って関数を呼び出すことで、非常に厄介な回避策が見つかりましたが、よりクリーンな方法があるはずです。

私の汚れたソリューション:

MyGlobal="some value" 
ret_val="" 

function ReturnAndAlter() { 
    ret_val="Returned string" 
    MyGlobal="changed value" 
} 

ReturnAndAlter   # call the bare function 
str=$ret_val    # and assign using the auxiliary global ret_val 
echo $str 
echo $MyGlobal   # Here both global variables are updated. 

任意の新しいアイデア?私が行方不明の関数を呼び出すいくつかの方法?

答えて

0

$(…)(コマンド展開)は、サブシェルで実行されます。
サブシェルが閉じると、サブシェル内のすべての変更が失われます。

結果を印刷して関数内の変数を変更することは、通常はお勧めできません。すべての変数を作成するか、のいずれかをという文字列で出力してください。

他に解決策はありません。

+0

はい。それは私が正しいと読んでいるなら、私の_dirty solution_です。 –

+0

@SergioGarcíaGalánFine、あなたはそれを使うことができます。 – sorontar

+0

最後に私はこの種の機能が今では必要ないようにスクリプト全体を再構成しなければなりません。それは初期段階にあったことをうれしく思います:-Dありがとう皆さん! –

1

グローバル変数を設定するのは、関数がそれを呼び出すシェルと直接通信する唯一の方法です。標準出力をキャプチャすることによって値を "返す"ことはシェルのセマンティクスによって必要とされるハックです。他のプログラムを呼び出すことが容易になりますシェルそのもの。

だから心配しないでください。いいえ、クールなテクニックが欠けているわけではありません。あなたはシェルがあなたにできることをやっている。

関連する問題