¿Cómo podría salir de una función, si una condición es verdadera sin matar a todo el script, acaba de regresar a antes de la llamada a la función.

Ejemplo

# 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
}
InformationsquelleAutor Atomiklan | 2013-08-04

3 Comentarios

  1. 91

    Uso:

    return [n]

    De help return

    volver: return [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.
    • Tenga en cuenta que si usted tiene set -e situado en la parte superior de la secuencia de comandos y su return 1 o cualquier otro número, además de 0, la secuencia de comandos de salida.
    • eso es cierto sólo si el error en la función es inesperado. Si se llama a la función utilizando, por ejemplo, || entonces es posible devolver un código distinto de cero y todavía tiene el script seguir para ejecutar.
    • Sí, definitivamente hay soluciones posibles, pero yo sólo quería llamar ese extra de cuidado necesita ser tomado con set -e y devolución de valores distintos de cero, como que me cogió por sorpresa en el pasado.
  2. 16

    Uso return operador:

    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
    }
  3. 1

    Si desea regresar de un exterior función con un error sin exiting usted puede utilizar este truco:

    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
    }

    Tratando de salir:

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

    Esto tiene la ventaja/desventaja de que, opcionalmente, puede desactivar esta característica: __fail_fast=x do-something-complex.

    Tenga en cuenta que esto hace que la función exterior para devolver 1.

    • Podrías explicar más en el interior de la función fail, ¿qué es el colon haciendo aquí?
    • El : es un bash operador que es un «no-op». Se evalúa la expresión, pero no hace nada con ella. Lo estoy utilizando para hacer la sustitución de variables que se producirá un error si la variable no está definida, la cual, obviamente no.
    • Gracias. Podría sustituir a la expresión a alguna otra expresión para comprobar el parámetro de entrada de do-something-complex? <code> checkPara () { if [ $1 -lt $2 ]; then echo $3; fi; } do-algo complejo() { checkPara $# 1 «mensaje para advertir a los usuarios cómo utilizar la función.» echo «sí» } </código de> me gustaría do-something-complex muestran usuario un mensaje y regresar de inmediato si no hay ningún parámetro de la fed a la función.
    • Sí, se podría hacer algo así, donde checkPara uso mi fail función para salir de la pila completa de funciones.
    • Parece que no funciona. (PS: code bloque no funciona en el comentario en stackoverflow). Que sigue funcionando después de checkPara.
    • checkPara () { if [ $1 -lt $2 ]; then echo $3; else fail "The parameter isn't right"; fi; }
    • Permítanos continuar esta discusión en el chat.

Dejar respuesta

Please enter your comment!
Please enter your name here