Читать интересную книгу Прикладные свободные программы и системы в школе - Максим Отставнов

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 18 19 20 21 22 23 24 25 26 ... 44

(Отсутствие простого механизма согласования между раскрытием арифметических выражений и условиями условного и циклического исполнения, различие в синтаксисе а) раскрываемых выражений, б) команды «expr» и в) обсуждаемой ниже команды «test» являются серьезными недостатками языка оболочки, заметно усложняющими его освоение даже опытными программистами.)

Хотя условие условного или циклического исполнения может задаваться самыми разными командами (поскольку любая команда завершается с каким-либо кодом возврата), чаще всего в соответствующих операторах используется команда «test». Эта команда вычисляет переданное ей в виде набора аргументов выражение и завершается с кодом возврата «0» (ноль), если оно истинно, «1», если оно ложно и «2», если выражение содержит синтаксическую ошибку. Она настолько важна для программирования оболочки, что для нее введено особое сокращение: вместо подачи команды «test» с аргументами можно просто заключить аргументы в квадратные скобки «[» и «]», отделив их от первого и последнего аргумента промежутками (Рис. 1-75).

Рис. 1-75

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

Командой «test» поддерживаются операции, перечисленные в таблице на Рис. 1-76. Они различаются по типу (точнее, по интерпретации) операндов, но все возвращают «логические» (в указанном выше смысле) значения.

Рис. 1-76

Операции над числами допускают в качестве операндов только константы и переменные, однако можно использовать и раскрываемые арифметические выражения. И символическое обозначение операций, и операнды выражений, передаваемых команде «test», в терминах командной строки являются операндами команды (хотя форма операций и похожа на ключи).

Условное исполнение

Оболочка реализует команду условного исполнения, доступную в трех модификациях: «if — then — fi», «if — then — else — fi» и «if — then — elif ... — fi». Простейшей является форма «if — then — fi» (Рис. 1-77).

Рис. 1-77Рис. 1-78

Выполняется оператор условного исполнения так: выполняется список_команд1, затем, если код завершения истинен (равен нулю), выполняется список_команд2. Команды в каждом списке могут соединяться переводом строки или точкой с запятой «;» (Рис. 1-78).

Обратите внимание, что если оператор условного исполнения (или любая другая сложная конструкция) вводится в интерактивном режиме, и строка завершилась раньше, чем оператор, оболочка выведет строку приглашения продолжения (значение переменной $PS2; по умолчанию «>»), будет ожидать продолжения ввода и повторять это, пока оператор не будет завершен (в данном случае — сложным символом «fi»).

Если в первом списке более одной команды, кодом завершения списка будет код завершения последней в списке команды. Однако существуют два других символа завершения команды: «&&» и «||». Кодом завершения списка, соединенного «&&», является результат выполнения операции «И» над значениями истинности кодов завершения входящих в список команд, а кодом завершения «||»-списка — результат выполнения операции «ИЛИ».

Использование в первом списке команды «if» более одной команды является экзотическим приемом, которого по возможности следует избегать.

Рис. 1-79Рис. 1-80

Вторая форма (Рис. 1-79) более сложна: выполняется список_команд1, затем, если код завершения истинен, выполняется список_команд2, а если ложен — список_команд3 (Рис. 1-80).

Рис. 1-81

И наконец, третья форма (Рис. 1-81) позволяет задавать множественные условия: если код завершения первого списка истинен, выполняется второй список команд, иначе выполняется третий список команд и, если его код завершения истинен, выполняется четвертый список команд. Конструкция «elif — then» может быть множественной, но в любом случае выполнен будет лишь один «then»-список.

В «if — then — elif ... fi» форме оператора «if» также может присутствовать конструкция «else»; следующий за ней список команд будет выполнен, если коды завершения «if»-списка и всех «elif»-списков оказались ложными.

Циклическое исполнение с предусловием

Оболочка поддерживает два оператора цикла с предусловием: «while — do — od» (Рис. 1-82) и «until — do — od» (Рис. 1-83).

Рис. 1-82Рис. 1-83

Выполнение любого из них заключается в том, что выполняется список_команд1 и, в зависимости от кода завершения либо выполняется список_команд2 и выполнение цикла повторяется, либо выполнение цикла завершается. «While»-цикл выполняется, пока код завершения первого списка истинен, а «until»-цикл — пока он ложен.

Обратите внимание, что «until»-цикл, в отличие от использования этого ключевого слова в большинстве языков программирования, является также циклом с предусловием, а не с постусловием. Если же действительно необходимо организовать циклическое исполнение с постусловием, реальное тело цикла можно включить в список_команд_1, завершив его командой проверки условия, а номинальное тело (заключенное между ключевыми словами «do» и «done») сделать пустым.

Циклическое исполнение со списком значений

Оболочка предоставляет также возможность организации циклического исполнения с переменной, пробегающей список значений (Рис. 1-84).

Рис. 1-84

Список_команд будет исполнен по одному разу для каждого значения в списке значений (Рис. 1-85).

Рис. 1-85

Если ключевое слово «in» и список значений не указаны, переменная будет пробегать список значений специальных переменных $1 — $9, соответствующих аргументам командной строки (см. ниже) (в порядке их следования), из которой запущен сценарий (программа).

Многовариантное условное исполнение

Для многовариантного условного исполнения в зависимости от значения строковой переменной оболочка поддерживает оператор «case» с на редкость причудливым синтаксисом (Рис. 1-86).

Рис. 1-86

Указанная строка (обычно — результат раскрытия значения переменной) поочередно сравнивается с шаблонами и при первом совпадении выполняется соответствующий список команд (до конструкции «;;»), после чего выполнение оператора «case» завершается.

Строки, указанные в качестве шаблонов, подвергаются обычному раскрытию, за исключением того, что специальные символы «*», «*», «[ ... ]» не приводят к поиску файлов, а используются (по тем же правилам, что и при раскрытии шаблонов имен файлов) как метасимволы при сравнении.

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

Ввод-вывод

Вывод значений переменных и выражений сценарием как правило осуществляется известной нам командой «echo» или командой «printf» (предназначенной для форматированного вывода), которую мы в этом курсе не рассматриваем.

Ввести данные (т.е. присвоить значения переменным) можно с помощью команды «read». Эта команда читает из стандартного ввода строку, разделяет ее на отдельные аргументы (пробелами, табуляцией, знаком переноса или символами, содержащимися в переменной окружения $IF), и присваивает их перечисленным в команде переменным. Если аргументов оказывается больше, чем переменных, остаток строки присваивается последней переменной (Рис. 1-87).

Рис. 1-87

Однако во многих случаях вывод (и ввод) осуществляется не только командой «echo», но и прочими командами, применяемыми в сценарии. Следует понимать, что каждая команда, ввод-вывод которой не переназначен явно и не включен в конвейер, наследует, в числе прочих атрибутов, дескрипторы стандартных ввода-вывода от подающего ее процесса. Таким образом, переназначив, например, стандартный вывод сценария в файл, мы тем самым переназначаем стандартный вывод каждой вызываемой программы, если только ее вывод не переназначается отдельно или не передается по конвейеру.

Передача аргументов сценарию

Как и любая команда, сценарий, написанный на языке оболочки, может вызываться с позиционными параметрами (ключами и операндами).

Сценарию эти параметры доступны посредством ряда специальных переменных, перечисленных в таблице на Рис. 1-88.

1 ... 18 19 20 21 22 23 24 25 26 ... 44
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Прикладные свободные программы и системы в школе - Максим Отставнов.

Оставить комментарий