No no hay; consulte §3.2.4 "Comandos compuestos" en el Manual de referencia de Bash para obtener información sobre las estructuras de control que hacen existir. En particular, tenga en cuenta la mención de break
y continue
, que no son tan flexibles como goto
, pero son más flexibles en Bash que en algunos idiomas y pueden ayudarlo a lograr lo que desea. (Lo que sea que quieras...)
Si lo está utilizando para omitir parte de un script grande para la depuración (vea el comentario de Karl Nicoll), entonces si es falso podría ser una buena opción (no estoy seguro si "falso" siempre está disponible, para mí está en /bin/falso) :
# ... Code I want to run here ...
if false; then
# ... Code I want to skip here ...
fi
# ... I want to resume here ...
La dificultad surge cuando llega el momento de extraer el código de depuración. La construcción "si es falso" es bastante sencilla y fácil de recordar, pero ¿cómo encuentras el fi coincidente? Si su editor le permite bloquear la sangría, puede sangrar el bloque omitido (luego querrá volver a colocarlo cuando haya terminado). O un comentario sobre la línea fi, pero tendría que ser algo que recordarás, lo que sospecho dependerá mucho del programador.
De hecho, puede ser útil para algunas necesidades de depuración o demostración.
Encontré esa solución de Bob Copeland http://bobcopeland.com/blog/2012/10/goto-in-bash/ elegant:
#!/bin/bash
# include this boilerplate
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$')
eval "$cmd"
exit
}
start=${1:-"start"}
jumpto $start
start:
# your script goes here...
x=100
jumpto foo
mid:
x=101
echo "This is not printed!"
foo:
x=${x:-10}
echo x is $x
da como resultado:
$ ./test.sh
x is 100
$ ./test.sh foo
x is 10
$ ./test.sh mid
This is not printed!
x is 101