1. ホーム
  2. bash

[解決済み] bashで関数内のグローバル変数を変更する方法は?

2022-06-27 21:13:03

質問

これを使って仕事をしています。

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 で、グローバル変数も変更しますか?

どのように解決するのですか?

コマンドの代入を行う場合(すなわち $(...) 構成) を使用すると、サブシェルが作成されます。サブシェルは親シェルから変数を継承しますが、これは一方向にしか働きません。サブシェルはその親シェルの環境を変更することはできません。

あなたの変数  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