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
}

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.

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
}

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.