私はこれを使って作業しています:
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
以下のようなスクリプトがあります:
#!/bin/bash
e=2
function test1() {
e=4
echo "hello"
}
test1
echo "$e"
結果は次のようになります:
hello
4
しかし、関数の結果を変数に割り当てた場合、グローバル変数e
は変更されません。
#!/bin/bash
e=2
function test1() {
e=4
echo "hello"
}
ret=$(test1)
echo "$ret"
echo "$e"
戻り値:
hello
2
聞いたことがあるevalの使用この場合、私は次のようにしましたtest1
:
eval 'e=4'
しかし結果は同じです。
なぜ変更されないのか説明していただけますか? 関数のエコーを保存しtest1
、ret
グローバル変数も変更するにはどうすればよいでしょうか?
ベストアンサー1
コマンド置換 (つまり、$(...)
構文) を使用すると、サブシェルが作成されます。サブシェルは親シェルから変数を継承しますが、これは一方向にしか機能しません。つまり、サブシェルは親シェルの環境を変更できません。
変数は e
サブシェル内で設定されますが、親シェルでは設定されません。サブシェルから親に値を渡す方法は 2 つあります。まず、何かを stdout に出力し、それをコマンド置換でキャプチャします。
myfunc() {
echo "Hello"
}
var="$(myfunc)"
echo "$var"
上記の出力:
Hello
0 から 255 までの範囲の数値の場合、 を使用してreturn
その数値を終了ステータスとして渡すことができます。
mysecondfunc() {
echo "Hello"
return 4
}
var="$(mysecondfunc)"
num_var=$?
echo "$var - num is $num_var"
出力は次のようになります:
Hello - num is 4