Bash関数の戻り値

bashスクリプトで、関数を実行して戻り値を表示させたいのですが。

function fun1(){
  return 34
}
function fun2(){
  local res=$(fun1)
  echo $res
}

fun2`を実行すると、"34"と表示されません。なぜこのようなことが起こるのでしょうか?

ソリューション

bashにはreturn文がありますが、この文で指定できるのは、その関数自身のexitステータス(0255の間の値で、0は"success"を意味する)だけです。つまり、returnはあなたが望むものではありません。

そうすれば、関数の出力を $() の中括弧を使って取り込むことができるので、まさにあなたが望んでいることのように思えます。

以下に例を示します。

function fun1(){
  echo 34
}

function fun2(){
  local res=$(fun1)
  echo $res
}

また、(0〜255の整数を返したいだけの場合)戻り値を得るための別の方法として、$?があります。

function fun1(){
  return 34
}

function fun2(){
  fun1
  local res=$?
  echo $res
}

また、戻り値を使って、fun1 || fun2fun10 を返した場合に fun2 のみを実行するというようなブーリアンロジックを使うことができることにも注意してください。 デフォルトの戻り値は、その関数内で最後に実行されたステートメントの終了値です。

解説 (12)

$(...) は、その中に含まれるコマンドによって標準出力に送られるテキストをキャプチャします。returnは標準出力には出力されません。$?` は最後のコマンドの結果コードを含みます。

fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}
解説 (2)

return文は、スクリプト全体のexitと同じように、その関数の終了コードを設定します。

最後のコマンドの終了コードは、常に $? 変数に格納されています。


function fun1(){
  return 34
}

function fun2(){
  local res=$(fun1)
  echo $? # 
解説 (0)