Конспект по bash. Продолжение

0
4818

Перевод конспекта по bash, который содержит в себе выжимку самых основных возможностей Bourne again shell. Конспект будет полезен любому программисту.

Первая часть


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

Конвейеры

Конвейеры — это команды, которые соединены операторами ;, &&, ||для выполнения в определенной последовательности. Операторы организации конвейеров работают следующим образом:

  • команда1 ; команда2команда2 выполняется после команды1 независимо от результата её работы ;
  • команда1 && команда2команда2 выполняется только после успешного выполнения команды1(то есть с кодом завершения 0);
  • команда1 || команда2команда2 выполняется только после неудачного выполнения команды1 (то есть код завершения команды1 будет отличным от 0)

Условные операторы

В скриптовом языке bash поддерживаются два оператора ветвления: if и case. Оператор if, как и в других языках, выполняет определенный блок указаний, в зависимости от условия. Условие помещают в двойные квадратные скобки [[ ... ]], которые bash рассматривает как один элемент с кодом выхода. Внутри блока операторов помещенных в [[ ]] разрешается использовать операторы && и ||. Например:

Обратите внимание, что [, условие и ] обязательно должны быть разделены пробелами, иначе оболочка воспримет в качестве команды [условие.

Ниже приведена таблица с возможными условиями сравнения:

Пример:

Если необходимо сделать выбор из нескольких альтернатив, пригодится оператор case. Принцип его работы легче понять на примере:

В примере оператор проверяет значение переменной $extension на совпадение с одним из шаблонов и в случае совпадения выполнит соответствующий блок кода. Если же совпадений не будет, выполнятся указания, соответствующие шаблону *.

Циклы

Язык оболочки дает пользователю возможность организовывать циклическое выполнение инструкций при помощи циклов: *

while

Оператор while описывается следующим образом:

Интерпретатор в первую очередь выполняет команды, описанные в условии. Если результат выполнения нулевой, то выполняется тело, а после ее выполнения, переход к следующей итерации, в противном случае происходит выход из цикла. В условии может быть любая допустимая команда. Например:

for

Цикл for выполняет тело для каждого элемента из списка. Синтаксис цикла for таков:

В качестве элементов обычно используют различные шаблоны (wildcards). Очень удобно применять for для прохождения по каталогам и выполнения операций над группой файлов. В примере ниже, цикл проходит по всем файлам с расширением *.bash, перемещает их в директорию ~/scripts и добавляет их права на исполнение.

select

Цикл select помогает организовать удобное меню выбора и применяется тогда, когда пользователь должен выбрать один элемент из предложенного списка. В общем цикл select имеет такой же синтаксис, как и цикл for:

При выполнении этого оператора, все элементы из списка высвечиваются на экране со своими порядковыми номерами в виде списка вариантов ответа, после списка выводится специальное приглашение для ввода. Обычно оно имеет вид #?. Введенный пользователем номер списка записывается в переменную ответ. Если ответ содержит номер пункта меню, то в переменную заносится значение соответствующего элемента из списка. Если в списке нет введенного пункта, список будет показан снова. После того, как пользователь сделает правильный выбор, выполнятся указания в теле, а цикл перейдет к следующей итерации и все действия повторятся с самого начала — именно поэтому работу цикла select желательно прерывать.

Пример выше запрашивает у пользователя название пакета, который он желает установить, далее интересуется тем какой пакетный менеджер использовать и в зависимости от выбора устанавливает нужный пакет и останавливает выполнение.
Оболочка также имеет команды, которые изменяют нормальное выполнение цикла. Оператор break полностью останавливает выполнение цикла, оператор continue — переходит к следующей итерации.

Функции

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

Объявление функции имеет следующий вид:

Объявление функции обязательно должно предшествовать ее первый вызов. Обращение к функции происходит путем указания ее имени в качестве команды.
Функция может принимать аргументы и возвращать после своего выполнения результат — код выхода. Функция обращается к своим аргументам точно так же, как и к локальным переменным, с помощью позиционных переменных — $1, $2 и тд. Результат работы можно возвращать с помощью команды return. Например, функция, которая принимает параметр (имя) и завершает свою работу с кодом 0:

Команда return возвращает код завершения 0 — это код успешного завершения сценария. Каждая программа по завершению работы записывает в переменную окружения #? код завершения — число от 0 до 255. С помощью этой переменной можно определять статус выполнения каждой отдельной команды или скрипта. Если программа завершилась ошибкой, кодом завершения будет целое число отличное от нуля. Обратите внимание, на то что, если сценарий завершается командой exit без параметров, кодом завершения сценария будет код завершения последней выполненной команды.

Отладка сценариев

Оболочка дает несколько средств для отладки сценариев. Для активации режима отладки, он должен быть запущен с помощью специальных опций.
Первая строка сценария должна иметь вид:

#!/bin/sh опция

Можно выбирать среди следующих функций:
–n — читать все команды, но не выполнять их;
–v — выводить все строки по мере их обработки интерпретатором;
*–x — выводить все команды и их аргументы по мере их выполнения.

Для отладки сценария частями, нужный фрагмент отмечают вызовом команды set с помощью соответствующей опции из таблицы. Причем, для включения режима отладки, перед опцией указывают символ -, для отключения режима отладки используют +:

Общая практика отладки заключается в том, чтобы прежде чем запустить ее, необходимо проверить его синтаксис с помощью опции -n. Для большей детальности можно комбинировать ключи -nv. После исправления синтаксических ошибок проводится отладка с помощью опции -x.

Послесловие

Надеюсь вы нашли для себя что-то новое в этом конспекте, или по крайней мере освежили свои знания.