bash 関数 - 変数内の関数の標準出力値を取得し、関数の外側で変数を変更します。

bash 関数 - 変数内の関数の標準出力値を取得し、関数の外側で変数を変更します。

特定の要求のために、bash関数のすべてのstdout出力を変数( "F_MY_FUNC_R")に格納する必要がありますが、次のものに基づいていくつかの変数( "VAL_A"と "VAL_B")の値を変更する関数も必要です。以下のコード。

質問:VAL_AとVAL_B変数が変更されていないのはなぜですか?解決策はありますか?

パスワード

VAL_A="none"
VAL_B="none"
f_my_func() {
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    echo "some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
F_MY_FUNC_R=$(f_my_func)
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

出力

[root@localhost some_folder]# echo "$F_MY_FUNC_R"
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
some info some info some info some info some info 
[root@localhost some_folder]# echo "$VAL_A"
none
[root@localhost some_folder]# echo "$VAL_B"
none

ありがとうございます! =D

ベストアンサー1

サブシェルはシェルの基本ルールです。できない親変数または環境を変更します。サブシェル内で関数を実行することは$(f_my_func)この規則の影響を受け、親変数VAL_AとVAL_Bは変更されません。

関数の親変数を本当に変更する必要がある場合は、関数の出力をキャプチャするのではなく、出力を別の変数に設定してください。

VAL_A="none"
VAL_B="none"
f_my_func() {
    nl=$'\n'
    F_MY_FUNC_R="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info $nl"
    F_MY_FUNC_R+="some info some info some info some info some info "
    VAL_A="some value"
    VAL_B="some value"
}
f_my_func
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"

おすすめ記事