bash の関数内でグローバル変数を変更するにはどうすればいいですか? 質問する

bash の関数内でグローバル変数を変更するにはどうすればいいですか? 質問する

私はこれを使って作業しています:

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'

しかし結果は同じです。

なぜ変更されないのか説明していただけますか? 関数のエコーを保存しtest1retグローバル変数も変更するにはどうすればよいでしょうか?

ベストアンサー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

おすすめ記事