Материал: 396_OS_uchebnoe_posobie_part1_2012

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

завершается. Если необходимо выполнить какие-то действия по умолчанию, следует включить в выражение шаблон «*», которому удовлетворяет любое значение.

В выражении case-esac должен присутствовать, по крайней мере, один шаблон. Максимальное число шаблонов не ограничено.

Шаблон формируется по правилам, аналогичным именам файлов и каталогов (с учётом символов расширения), а также используется оператор дизъюнкции «|» (операция ИЛИ). Ниже приведён пример использования блока case-esac.

$case “$TERM” in \ >*term) \

>TERM = xterm \ >;; \

>network | dialup | unknown | vt[0-9]*) \ >TERM=vt100 \

>;; \ >esac

4.15. Циклические конструкции

Циклические конструкции применяются в том случае, когда надо многократно повторить одни и те же действия.

4.15.1. Цикл for

Цикл for предназначен для выполнения определённых действий над несколькими данными. Формат записи цикла следующий:

$for имя_переменной in список_значений ; \ >do \

>команда1 ; команда2 ...\ >done

В цикле for переменной с указанным именем последовательно присваиваются все значения из списка_значений, и для каждого из этих значений выполняется список_команд. Значения в списке_значений перечисляются через пробел. Например, следующая команда выдаст на экран десять строк: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10:

$for i in 1 2 3 4 5 6 7 8 9 10 ; \ >do \

>echo $i ; \ >done

46

4.15.2. Цикл while

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

$while выражение ; \ >do \ >список_команд ; \ >done

На каждой итерации этого цикла выполняется выражение и до тех пор, пока оно возвращает значение 0, выполняется список_команд. Если в качестве выражения указать команду /bin/true, то цикл будет бесконечным и завершить его можно только, используя оператор break. Пропустить какую-либо часть цикла и перейти на следующую его итерацию можно, используя в

списке_команд команду continue.

Например, вывод последовательности цифр от 1 до 9 можно организовать следующим образом:

$x=1

$while [ $x -lt 10 ] ; \ >do \

>echo $x ; \ >x=$(( $x+1 )) ; \ >done

4.15.3. Цикл until

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

$until выражение ; \ >do \ >список_команд ; \ >done

На каждой итерации этого цикла выполняется выражение и до тех пор, пока оно возвращает значение, отличное от 0, выполняется список_команд. Если в качестве выражения указать команду /bin/false, то цикл будет бесконечным и завершить его можно только, используя оператор break.

Например, вывод последовательности цифр от 1 до 9 можно организовать следующим образом:

47

$x = 1

$until [ $x -ge 10 ] ; \ >do \

>echo $x ; \ >x=$(( $x+1 )) ; \ >done

4.15.4. Цикл select

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

$select имя_переменной in список_значений ; \ >do \

>список_команд ; \ >done

При запуске цикла select в стандартный поток ошибок выводится список_значений. Перед каждым пунктом отображается номер, который и предлагается выбрать пользователю. Затем выводится приглашение ввода номера. Формат приглашения определяется переменной PS3. Выбрав номер пункта, пользователь вводит его с клавиатуры. После этого для указанного элемента списка_значений (который помещается в указанную переменную) выполняется список_команд. После этого опять выводится меню цикла select.

Завершить цикл select можно либо после ввода EOF (нажатия комбинации клавиш Ctrl+D), либо при помощи команды break. Пример использования цикла select:

$select file in ./*.c ; \ >do\

>gcc –Wall -ansi $file –o `basename $file .c` ; \ >done

В данном примере пользователю предлагается выбрать один из файлов с суффиксом .c, расположенных в текущем каталоге. Выбранный файл будет скомпилирован, и результат компиляции помещён в файл с таким же именем, но без суффикса .c. Имя файла результата формируется командой basename31, результат которой подставляется в команду компиляции.

31 Подробнее о команде basename смотрите в электронном справочнике man.

48

4.16. Группирование команд. Функции. Скрипты

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

Функции определяются так:

$function имя () { список_команд ; }

В дальнейшем, если будет дана команда имя, то вместо неё будет выполнен список_команд. Например32:

$ls

$function ls () { /bin/ls –A $@ ; } $ls

. ..

Здесь объявляется функция с именем ls, которая содержит всего лишь одну команду /bin/ls с соответствующими параметрами. До того, как определена эта функция, команда ls приводит к запуску файла /bin/ls, выводящего на экран содержимое каталога.

Скрипт – это обычный текстовый файл33, содержащий команды оболочке. Такой файл может быть запущен на исполнение следующим образом:

$bash имя_файла

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

Другой вариант запуска скрипта – просто указать его имя в командной оболочке (т.е. сделав из него некий вид программы). Для этого надо в параметрах доступа определить файл как исполняемый, и в первых строках этого файла явно указать оболочку, для которой предназначен этот скрипт, следующим образом:

#!оболочка

В общем случае символ # в скрипте означает комментарий, требующий игнорировать строку. Однако если он является первым символом файла и за ним следует символ !, то это означает «магическую комбинацию», за которой указывается путь к файлу, использующемуся в качестве интерпретатора скрипта (например, /bin/bash, /bin/perl, /bin/sh и т.д). Встретив такую

32Значение переменной @ смотрите ниже.

33Обычно такие файлы имеют суффикс .sh.

49

комбинацию символов, командная оболочка запустит соответствующий файл и передаст ему его имя в качестве аргумента.

Скрипт, в свою очередь, может содержать все конструкции, описанные ранее (в том числе и функции).

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

#!/bin/bash

X=1

read –p “Введите X = ” X if [ $X –lt 0 ] ; then

echo “Вы ввели отрицательное число” else

echo “Вы ввели положительное число”

fi

4.17. Анализ опций, передаваемых группе команд (функции и скрипту)

Любому скрипту, точно так же, как и функции, могут быть переданы аргументы (так, как это делается при запуске любой команды). Передаются аргументы в виде специальных переменных (таблица 7).

Таблица 7. Специальные переменные, используемые в скриптах.

Перем.

Значение

$0

Имя выполняемой команды. Для скрипта – это путь, указанный при

 

его вызове. Для функции – имя оболочки.

$n

Переменные, соответствующие аргументам, заданным при вызове

 

сценария. Здесь n – десятичное число, соответствующее номеру ар-

 

гумента. (Первый аргумент – $1, второй – $2 и т.д.).

$#

Число аргументов, указанных при вызове сценария.

$*

Строка аргументов, заключённая в двойные кавычки.

$@

Все аргументы, каждый заключён в двойные кавычки.

$?

Статус завершения последней выполненной команды.

$$

Номер процесса, соответствующего текущей оболочке.

$!

Номер процесса, соответствующий команде, запущенной в фоновом

 

режиме.

Последовательно просмотреть аргументы командной строки можно, используя следующую конструкцию:

50

Источник: https://studfile.net/preview/16708918/