В bash нет goto
.
Вот несколько грязных обходных путей, используя 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
.
Если вы можете разделить свой длинный код на более мелкие части, рассмотрите возможность его перемещения в отдельные файлы и вызова их из родительского скрипта.