Come uscire da una funzione in bash


97

Come uscireste da una funzione se una condizione è vera senza uccidere l'intero script, tornate indietro a prima di chiamare la funzione.

Esempio

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

Risposte:


136

Uso:

return [n]

A partire dal help return

ritorno : ritorno [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
Nota che se hai set -eimpostato all'inizio dello script e il tuo return 1o qualsiasi altro numero oltre a 0, l'intero script verrà chiuso.
Yevgeniy Brikman

1
@YevgeniyBrikman è vero solo se l'errore nella funzione è imprevisto. Se la funzione viene chiamata utilizzando, ad esempio ||, è possibile restituire un codice diverso da zero e continuare a eseguire lo script.
Dan Passaro

1
@DanPassaro Sì, ci sono sicuramente delle soluzioni possibili, ma volevo solo sottolineare che è necessario prestare particolare attenzione set -ee restituire valori diversi da zero, in quanto mi ha colto di sorpresa in passato.
Yevgeniy Brikman

20

Usa returnoperatore:

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

Se vuoi tornare da una funzione esterna con un errore senza exiting, puoi usare questo trucco:

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
}

Provalo:

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

Questo ha il vantaggio aggiunto / svantaggio che si può opzionalmente disattivare questa funzionalità: __fail_fast=x do-something-complex.

Si noti che ciò fa sì che la funzione più esterna restituisca 1.


Potresti spiegare di più sulla funzione interna fail, cosa ci fa il colon qui?
Brook hong

Il :è dotato di un operatore di bash che è un "no-op". Valuta l'espressione ma non fa nulla con essa. Lo sto usando per eseguire la sostituzione delle variabili che fallirà se la variabile non è definita, cosa che ovviamente non è.
Elliot Cameron

Grazie. Posso sostituire l'espressione con un'altra espressione per controllare il parametro di input di do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; quindi echo $ 3; fi; } do-qualcosa-complex () {checkPara $ # 1 "Alcuni messaggi qui per avvertire l'utente come usare la funzione." echo "yes"} </code> do-something-complexMostrerei all'utente un messaggio e tornerei immediatamente se non ci sono parametri forniti alla funzione.
Brook hong

Sì, potresti fare qualcosa del genere in cui checkParauseresti la mia failfunzione per uscire dall'intero stack di funzioni.
Elliot Cameron

Sembra non funzionare. (PS: il codeblocco non funziona nei commenti su stackoverflow). Continua a correre dietro checkPara.
Brook hong
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.