¿Cómo saldría de una función si una condición es verdadera sin matar todo el script? Simplemente vuelva a antes de llamar 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
}
set -e
establecido en la parte superior de su secuencia de comandos y sureturn 1
o cualquier otro número además de 0, se cerrará la secuencia de comandos completa.||
entonces es posible devolver un código distinto de cero y que el script continúe ejecutándose.set -e
y devolver valores distintos de cero, ya que eso me tomó por sorpresa en el pasado.return
Operador 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 }
fuente
Si desea regresar de una función externa con un error sin
exit
ing, puede usar 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 }
Probándolo:
$ do-something-complex try-this: command not found bash: __fail_fast: This didn't work
Esto tiene la ventaja / desventaja añadida de que, opcionalmente, puede desactivar esta característica:
__fail_fast=x do-something-complex
.Tenga en cuenta que esto hace que la función más externa devuelva 1.
fuente
fail
, qué hace el colon aquí?:
es un operador de bash incorporado que es "no operativo". Evalúa la expresión pero no hace nada con ella. Lo estoy usando para hacer una sustitución de variables que fallará si la variable no está definida, lo que obviamente no lo está.do-something-complex
? <code> checkPara () {if [$ 1 -lt $ 2]; luego echo $ 3; fi; } do-something-complex () {checkPara $ # 1 "Algún mensaje aquí para advertir al usuario cómo usar la función". echo "yes"} </code> Ledo-something-complex
mostraría al usuario algún mensaje y regresaría inmediatamente si no hay ningún parámetro alimentado a la función.checkPara
usaría mifail
función para salir de toda la pila de funciones.code
bloque no funciona en el comentario sobre stackoverflow). Sigue corriendo despuéscheckPara
.