関数内で戻るとプログラムが終了する

関数内で戻るとプログラムが終了する

これは私のコードの抜粋です:

ninja ()
{
  if $1 = toto
  then
  return 1
  elif $1 = tata
  then
  return 4
  fi
}

main () {
  ninja "tata"
  if [ $? -ne 1 ]
  then
    somecode
  fi
}

main "$@"

理由もなく、関数が何かを返すと、プログラムは終了し (トラップ EXIT でテストしました)、関数は 4 を返してトラップを実行します。

編集:コメントすると機能します

set -o errexit
set -o errtrace

しかし、どうすればエラーを見つけられるのでしょうか?

答え1

関数の引数が何らかの文字列と同等であることをテストしたい場合は、construct を使用する必要がありますif [ "$x" == "string" ]。コードは次のようになります。

test () {
  if [ "$1" == "toto" ] then
    return 1
  elif [ "$1" == "tata" ] then
    return 4
  fi
}

main () {
  test "tata"
  if [ $? -ne 1 ] then
    echo "somecode"
  fi
}

main "$@"

testまた、関数には name を使用できます。builtin を呼び出す場合はtestbuiltin testconstruct を使用します。

=また、 (代入)と(比較)に注意してください==。テスト内では[]演算子=は のように動作し==、文字列の等価性をテストします(数値ではありません)。

set -o errexitコマンドがゼロ以外 (成功ではない) を返すとすぐに終了します。ninjaを返し1(ゼロ以外)、終了します。

テストのないコードは動作しません。原因ifステートメントは、命令を実行してコマンドの終了状態を判別しようとします。終了状態がゼロ (成功) の場合は、 まで命令を実行しthenますeliffi

関連情報