bashで関数を終了する方法


97

スクリプト全体を強制終了せずに条件がtrueの場合に関数を終了するには、関数を呼び出す前に戻ってください。

# Start script
Do scripty stuff here
Ok now lets call FUNCT
FUNCT
Here is A to come back to

function FUNCT {
  if [ blah is false ]; then
    exit the function and go up to A
  else
    keep running the function
  fi
}

回答:


136

使用する:

return [n]

から help return

return:return [n]

Return from a shell function.

Causes a function or sourced script to exit with the return value
specified by N.  If N is omitted, the return status is that of the
last command executed within the function or script.

Exit Status:
Returns N, or failure if the shell is not executing a function or script.

19
set -eスクリプトの先頭return 1に0以外の数値を設定した場合、スクリプト全体が終了することに注意してください。
Yevgeniy Brikman 2016年

1
@YevgeniyBrikmanこれは、関数のエラーが予期しないものである場合にのみ当てはまります。たとえば、関数が呼び出された場合、||ゼロ以外のコードを返し、スクリプトの実行を継続させることができます。
Dan Passaro

1
@DanPassaroうん、確かに可能な解決策がありset -eますが、私は過去に驚いたので、ゼロ以外の値を使用して返す必要があることに注意したいと思いました。
Yevgeniy Brikman

20

return演算子を使用:

function FUNCT {
  if [ blah is false ]; then
    return 1 # or return 0, or even you can omit the argument.
  else
    keep running the function
  fi
}

2

外部関数からエラーなしでexiting せずに戻りたい場合は、次のトリックを使用できます。

do-something-complex() {
  # Using `return` here would only return from `fail`, not from `do-something-complex`.
  # Using `exit` would close the entire shell.
  # So we (ab)use a different feature. :)
  fail() { : "${__fail_fast:?$1}"; }

  nested-func() {
      try-this || fail "This didn't work"
      try-that || fail "That didn't work"
  }
  nested-func
}

試してみる:

$ do-something-complex
try-this: command not found
bash: __fail_fast: This didn't work

これには、オプションでこの機能をオフにできるという利点と欠点があります__fail_fast=x do-something-complex

これにより、最も外側の関数が1を返すことに注意してください。


内部関数についてもっと詳しく説明しfailてください。ここでコロンは何をしていますか?
ブルック・ホン

:内蔵の「無操作」ではありませんbashの演算子です。式を評価しますが、それに対しては何もしません。変数が定義されていない場合に失敗する変数置換を行うためにそれを使用していますが、それは明らかに定義されていません。
Elliot Cameron

ありがとう。式を他の式に置き換えて、入力パラメータを確認できますdo-something-complexか?<code> checkPara(){if [$ 1 -lt $ 2]; 次に$ 3をエコーし​​ます。fi; } do-something-complex(){checkPara $#1「関数の使用方法をユーザーに警告するメッセージがここにあります。」echo "yes"} </ code> do-something-complex関数にパラメータが渡されない場合は、ユーザーにメッセージを表示してすぐに戻ります。
ブルックホン

はいcheckPara、私のfail関数を使用して関数のスタック全体を終了するようなことを行うことができます。
Elliot Cameron

動作していないようです。(PS:codeブロックは、stackoverflowのコメントでは機能しません)。それ以降も実行され続けますcheckPara
ブルックホン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.