Comment quitter une fonction dans bash

97

Comment sortiriez-vous d'une fonction si une condition est vraie sans tuer tout le script, revenez simplement à avant d'appeler la fonction.

Exemple

# 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
la source

Réponses:

136

Utilisation:

return [n]

De help return

retour : retour [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
la source
19
Notez que si vous avez set -edéfini en haut de votre script et votre return 1ou tout autre nombre en plus de 0, tout votre script se fermera.
Yevgeniy Brikman
1
@YevgeniyBrikman ce n'est vrai que si l'erreur dans la fonction est inattendue. Si la fonction est appelée par exemple, ||il est possible de renvoyer un code différent de zéro et de continuer à exécuter le script.
Dan Passaro le
1
@DanPassaro Yup, il y a certainement des solutions possibles, mais je voulais juste souligner qu'il fallait faire très attention set -eet renvoyer des valeurs non nulles, car cela m'a surpris dans le passé.
Yevgeniy Brikman
20

Utiliser l' returnopérateur:

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
la source
2

Si vous voulez revenir d'une fonction externe avec une erreur sans exiting, vous pouvez utiliser cette astuce:

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
}

Essayer:

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

Ceci a l'avantage / inconvénient supplémentaire que vous pouvez éventuellement désactiver cette fonction: __fail_fast=x do-something-complex.

Notez que cela fait que la fonction la plus externe renvoie 1.

Elliot Cameron
la source
Pourriez-vous expliquer plus sur la fonction interne fail, que fait le colon ici?
brook hong
Le :est un opérateur bash intégré qui est un "no-op". Il évalue l'expression mais ne fait rien avec. Je l'utilise pour faire une substitution de variable qui échouera si la variable n'est pas définie, ce qui n'est évidemment pas le cas.
Elliot Cameron
Merci. Puis-je remplacer l'expression par une autre expression pour vérifier le paramètre d'entrée do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; puis echo $ 3; Fi; } do-something-complex () {checkPara $ # 1 "Un message ici pour avertir l'utilisateur comment utiliser la fonction." echo "yes"} </code> Je do-something-complexmontrerais à l'utilisateur un message et je reviendrais immédiatement s'il n'y a pas de paramètre fourni à la fonction.
brook hong
Oui, vous pouvez faire quelque chose comme ça où checkParautiliser ma failfonction pour quitter toute la pile de fonctions.
Elliot Cameron
Cela ne semble pas fonctionner. (PS: le codebloc ne fonctionne pas en commentaire sur stackoverflow). Il continue de courir après checkPara.
brook hong