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.