Como sair de uma função no bash

97

Como você sairia de uma função se uma condição fosse verdadeira sem matar todo o script, basta retornar para antes de chamar a função.

Exemplo

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

Respostas:

136

Usar:

return [n]

De help return

retorno : retorno [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
fonte
19
Observe que se você set -edefiniu no topo do seu script e seu return 1ou qualquer outro número além de 0, todo o seu script será encerrado.
Yevgeniy Brikman
1
@YevgeniyBrikman isso só é verdade se o erro na função for inesperado. Se a função for chamada usando, por exemplo ||, é possível retornar um código diferente de zero e ainda fazer com que o script continue a ser executado.
Dan Passaro
1
@DanPassaro Sim, definitivamente existem soluções possíveis, mas eu só queria alertar que é preciso ter um cuidado extra set -ee retornar valores diferentes de zero, pois isso me pegou de surpresa no passado.
Yevgeniy Brikman
20

returnOperador de uso :

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
fonte
2

Se você quiser retornar de uma função externa com um erro sem exitfazer isso, use este truque:

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
}

Experimentando:

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

Isso tem a vantagem / desvantagem de ser opcionalmente desativado: __fail_fast=x do-something-complex .

Observe que isso faz com que a função mais externa retorne 1.

Elliot Cameron
fonte
Você poderia explicar mais sobre a função interna fail, o que o cólon está fazendo aqui?
Brook hong
O :é um operador bash integrado que é "no-op". Ele avalia a expressão, mas não faz nada com ela. Estou usando para fazer a substituição de variáveis ​​que falhará se a variável não for definida, o que obviamente não está.
Elliot Cameron
Obrigado. Posso substituir a expressão por alguma outra expressão para verificar o parâmetro de entrada do-something-complex? <code> checkPara () {if [$ 1 -lt $ 2]; então echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "Alguma mensagem aqui para avisar o usuário como usar a função." echo "yes"} </code> Gostaria de do-something-complexmostrar ao usuário alguma mensagem e retornar imediatamente se não houver nenhum parâmetro alimentado para a função.
Brook hong
Sim, você poderia fazer algo assim, onde checkParausaria minha failfunção para sair de toda a pilha de funções.
Elliot Cameron,
Parece que não está funcionando. (PS: codebloco não funciona em comentário sobre stackoverflow). Ele continua correndo atrás checkPara.
Brook hong