Bash. Как обойтись без goto

Bash. Как обойтись без gotoЕсли вы программировали в командой оболочке cmd в Windows, то вы, возможно, использовали оператор goto для того, чтобы выполнять различные блоки операторов. В bash нет оператора goto, и он, в общем, и не нужен. Однако, при переходе от cmd к bash может возникнуть вопрос, как же обойтись без goto в bash. Процесс выполнения скрипта в этих оболочках различается, тем не менее, можно написать в любой из них скрипт, который будет работать точно так же, как и скрипт в другой оболочке. 

Пример 1: Несколько блоков, из которых должен выполниться только один.

Скрипт на cmd:

Пример очень простой, между меткой и оператором goto может быть значительно большее количество команд, конечно же. И для операторов после LABEL3 переход нам не нужен, потому что и так уже достигнут конец скрипта.

Скрипт на bash:

В целом скрипты выполняются абсолютно идентичным способом. Различия вот в чем. В bash необходимо определить функцию до того, как она будет вызвана в первый раз. В cmd не используются функции, поэтому гибкость алгоритма обеспечивается непосредственными переходами при помощи goto на метку. Метка может быть в любом месте скрипта, как до команды перехода, так и после. В плане гибкости cmd имеет некоторое преимущество в том смысле, что метку можно вставить в любое место скрипта. Но bash с использованием функций позволяет сделать скрипт более строгим, более предсказуемым.

А в плане результата данный пример и в cmd, и в bash одинаков. Главное понять, что в cmd сам скрипт является целиком линейным, а в bash за счет возможности создания функций не является, так как сама функция представляется при ее вызове как обычная команда.

Пример 2: При соблюдении условия будет выполняться дополнительная часть команд.

Скрипт на cmd:

Получатся вложенный блок, который можно показательно выделить отступами

Такой вариант в bash будет выглядеть следующим образом:

Вложенный блок выделяется в отдельную функцию label2, вызов которой осуществляется из label1. НО! Эта функция должна быть УЖЕ ОПРЕДЕЛЕНА к моменту первого вызова, поэтому в скрипте она должна находиться ВЫШЕ функции label1.

Bash. Как обойтись без goto: 2 комментария

  1. #kstn

    Имхо тогда уж лучше

    case "$1" in
    1) label1 ;;
    2) label2 ;;
    3) label3 ;;
    esac

    или уж

    if [ "$1" == "1" ]; then label1;
    elif [ "$1" == "2" ]; then label2;
    elif [ "$1" == "3" ]; then label3;
    fi

    хотя первое, имхо, читабельнее

    1. mnorin Автор записи

      Тогда параллель будет не такая явная. В примере я хотел как раз показать практически идентичность основного логического блока. А вообще да, оптимизация наш друг.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *