Здесь нет goto
в bash.
Вот некоторый грязный обходной путь, trap
который прыгает только назад :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
Вывод:
$ ./test.sh
foo
I am
here now.
Это не должно использоваться таким образом, но только в образовательных целях. Вот почему это работает:
trap
использует обработку исключений для достижения изменения в потоке кода. В этом случае trap
перехватывает все, что заставляет скрипт завершиться. Команда goto
не существует, и, следовательно, выдает ошибку, которая обычно завершает работу сценария. Эта ошибка обнаруживается trap
, и 2>/dev/null
скрывает сообщение об ошибке, которое обычно отображается.
Эта реализация goto, очевидно, ненадежна, поскольку любая несуществующая команда (или любая другая ошибка, связанная с этим способом) будет выполнять ту же команду прерывания. В частности, вы не можете выбрать, какой ярлык перейти.
По сути, в реальном сценарии вам не нужны никакие операторы goto, они избыточны, поскольку случайные вызовы в разные места только затрудняют понимание вашего кода.
Если ваш код вызывается много раз, рассмотрите возможность использования цикла и изменения его рабочего процесса для использования continue
и break
.
Если ваш код повторяет сам, подумайте о написании функции и вызове ее столько раз, сколько вы хотите.
Если ваш код должен перейти в конкретный раздел, основанный на значении переменной, то подумайте об использовании case
оператора.
Если вы можете разделить свой длинный код на более мелкие части, рассмотрите возможность его перемещения в отдельные файлы и вызова их из родительского сценария.
goto
в Bash нет (по крайней мере, это говоритcommand not found
для меня). Зачем? Скорее всего, есть лучший способ сделать это.