So beenden Sie eine Funktion in bash

94

Wie würden Sie eine Funktion verlassen, wenn eine Bedingung erfüllt ist, ohne das gesamte Skript zu beenden? Kehren Sie einfach zurück, bevor Sie die Funktion aufgerufen haben.

Beispiel

# 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
}
Atomiklan
quelle

Antworten:

132

Verwenden:

return [n]

Von 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.
Mohit
quelle
19
Beachten Sie , dass Ihr gesamtes Skript beendet wird , wenn Sie set -eoben in Ihrem Skript und Ihre return 1oder eine andere Zahl außer 0 festgelegt haben.
Jewgenij Brikman
1
@YevgeniyBrikman das ist nur wahr, wenn der Fehler in der Funktion unerwartet ist. Wenn die Funktion zB aufgerufen wird, ||ist es möglich, einen Code ungleich Null zurückzugeben und das Skript weiterhin auszuführen.
Dan Passaro
1
@DanPassaro Yup, es gibt definitiv mögliche Lösungen, aber ich wollte nur darauf hinweisen, dass besondere Sorgfalt geboten werden muss set -eund Werte ungleich Null zurückgegeben werden müssen, da mich das in der Vergangenheit überrascht hat.
Jewgenij Brikman
20

Verwenden returnBetreiber:

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
}
Nemanja Boric
quelle
2

Wenn Sie mit einem Fehler von einer äußeren Funktion zurückkehren möchten, ohne exiting, können Sie diesen Trick verwenden:

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
}

Probieren Sie es aus:

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

Dies hat den zusätzlichen Vor- und Nachteil, dass Sie diese Funktion optional deaktivieren können : __fail_fast=x do-something-complex.

Beachten Sie, dass dadurch die äußerste Funktion 1 zurückgibt.

Elliot Cameron
quelle
Könnten Sie mehr über die innere Funktion erklären fail, was macht der Doppelpunkt hier?
Brook Hong
Das :ist ein eingebauter Bash-Operator, der ein "No-Op" ist. Es wertet den Ausdruck aus, macht aber nichts damit. Ich verwende es, um eine Variablensubstitution durchzuführen, die fehlschlägt, wenn die Variable nicht definiert ist, was offensichtlich nicht der Fall ist.
Elliot Cameron
Vielen Dank. Könnte ich den Ausdruck durch einen anderen Ausdruck ersetzen, um den Eingabeparameter von zu überprüfen do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; dann echo $ 3; fi; } do-Something-Complex () {checkPara $ # 1 "Hier eine Meldung, die den Benutzer vor der Verwendung der Funktion warnt." echo "yes"} </ code> Ich würde dem do-something-complexBenutzer eine Nachricht anzeigen und sofort zurückkehren, wenn der Funktion kein Parameter zugeführt wird.
Brook Hong
Ja, Sie könnten so etwas tun, wenn Sie checkParameine failFunktion verwenden würden, um den gesamten Funktionsstapel zu verlassen.
Elliot Cameron
Es scheint nicht zu funktionieren. (PS: codeBlock funktioniert nicht im Kommentar zum Stackoverflow). Es läuft weiter checkPara.
Brook Hong