分岐せずにbash関数から文字列を返す方法は?

分岐せずにbash関数から文字列を返す方法は?

私は私の機能を持っています

fun() {
    local result
    ...complex calculations...
    echo "$result"
}

もちろん、次のコマンド置換で呼び出すことができます。

something="$(fun)"

しかし、それは私が望むものではありません。不必要にフォークしてfunサブシェルで実行しようとしています。

$resultフォークなしで使用したい。

簡単な解決策(でグローバル変数の設定)以外にfun()何ができますか?

答え1

結果を返す変数名を関数に割り当てます。

foo () {
    declare -n result="$1"

    # stuff that sets result
    result='Hello world'
}

foo myvar1
foo myvar2

# Will print "Hello world" twice:
echo "$myvar1"
echo "$myvar2"

この変数resultは名前参照変数であり、foo関数内のすべての参照は、名前が関数の最初の引数として提供される変数を参照します。

これにはbashバージョン4.3以降が必要です。

答え2

私は単純な関数から値を返し、呼び出し直後に値を取得するためにグローバルを使用します。たとえば、「アウト」

良い

    foo() {
      local a='Hello World'
      a="${a% *}" # some work
      OUT="$a"
    }

   foo; myVar="$OUT"

関連情報