Não há goto
no bash.
Aqui está uma solução alternativa suja usando trap
qual pula apenas para trás :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
Resultado:
$ ./test.sh
foo
I am
here now.
Isso não deve ser usado dessa maneira, mas apenas para fins educacionais. Aqui está o porquê disso funcionar:
trap
está usando o tratamento de exceções para obter a alteração no fluxo de código. Nesse caso, trap
está capturando qualquer coisa que faça com que o script EXIT. O comando goto
não existe e, portanto, gera um erro, que normalmente sai do script. Este erro está sendo detectado trap
e 2>/dev/null
oculta a mensagem de erro que normalmente seria exibida.
Obviamente, essa implementação do goto não é confiável, pois qualquer comando inexistente (ou qualquer outro erro, dessa maneira) executaria o mesmo comando trap. Em particular, você não pode escolher para qual rótulo ir.
Basicamente, no cenário real, você não precisa de nenhuma instrução goto, elas são redundantes, pois chamadas aleatórias para lugares diferentes dificultam a compreensão do seu código.
Se seu código for chamado várias vezes, considere usar loop e altere seu fluxo de trabalho para usar continue
e break
.
Se o seu código se repetir, considere escrever a função e chamá-la quantas vezes quiser.
Se seu código precisar pular para uma seção específica com base no valor da variável, considere usar a case
instrução
Se você pode separar seu código longo em partes menores, considere movê-lo para arquivos separados e chame-os a partir do script pai.
goto
no bash (pelo menos dizcommand not found
para mim). Por quê? Provavelmente, existe uma maneira melhor de fazê-lo.