No hay goto
en bash.
Aquí hay algunas soluciones sucias trap
que usan saltos solo hacia atrás :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
Salida:
$ ./test.sh
foo
I am
here now.
Esto no debe usarse de esa manera, sino solo con fines educativos. Aquí es por qué esto funciona:
trap
está utilizando el manejo de excepciones para lograr el cambio en el flujo de código. En este caso, trap
está detectando cualquier cosa que provoque que el script salga. El comando goto
no existe, y por lo tanto arroja un error, que normalmente saldría del script. Este error se está detectando trap
y 2>/dev/null
oculta el mensaje de error que normalmente se mostraría.
Esta implementación de goto obviamente no es confiable, ya que cualquier comando inexistente (o cualquier otro error, de esa manera), ejecutaría el mismo comando trap. En particular, no puede elegir a qué etiqueta ir.
Básicamente, en un escenario real, no necesita ninguna instrucción goto, son redundantes ya que las llamadas aleatorias a diferentes lugares solo hacen que su código sea difícil de entender.
Si su código se invoca muchas veces, considere usar loop y cambiar su flujo de trabajo para usar continue
y break
.
Si su código se repite, considere escribir la función y llamarla tantas veces como desee.
Si su código necesita saltar a una sección específica basada en el valor de la variable, considere usar la case
instrucción.
Si puede separar su código largo en partes más pequeñas, considere moverlo a archivos separados y llamarlos desde el script principal.
goto
en bash (al menos lo dicecommand not found
para mí). ¿Por qué? Lo más probable es que haya una mejor manera de hacerlo.