Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Stsenarii.doc
Скачиваний:
0
Добавлен:
22.12.2018
Размер:
125.95 Кб
Скачать

Операторы цикла Язык оболочки позволяет организовывать циклическое выполнение команд. В распоряжение пользователю предлагается 4 варианта циклов: while, until, for и select.

Цикл while

Оператор цикла while имеет следующий синтаксис:

while <условие>

do

<список>

done

При выполнении цикла сначала выполняется список команд, представляющих <условие>. Если результат ненулевой, то происходит выход из цикла, в противном случае выполняется тело цикла <список> и происходит переход на следующую итерацию. Хотя в качестве условия <команда> может использоваться любая допустимая в UNIX команда, обычно это команда test.

Ниже приведен пример сценария, в котором производится выдача на терминал десяти последовательных чисел от 0 до 9.

#!/bin/sh

x=0

while [ $x –lt 10 ] # значение переменной x меньше 10?

do

echo $x # выводим х

x=`expr $x + 1` # увеличиваем x на 1

done

В следующем примере в файл log каждую минуту записывается текущая дата и время:

#!/bin/bash

while (true)

do

date >> log

sleep 60 # подождать минуту

done

Цикл until

Оператор цикла until аналогичен оператору while и имеет следующий синтаксис:

until <условие>

do

<список>

done

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

Ниже приведен пример сценария, в котором производится выдача на терминал десяти последовательных чисел от 0 до 9, но уже с использованием цикла until.

#!/bin/sh

x=0

until [ $x -ge 10 ] # значение переменной x больше или равно 10?

do

echo $x # выводим х

x=`expr $x + 1` # увеличиваем x на 1

done

Цикл for

Цикл for выполняет команды из <списка> для каждого <элемента> и имеет следующий синтаксис:

for <переменная> [in <элемент1> <элемент2> … <элементN>]

do

<список>

done

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

Если конструкция [in <элемент1> <элемент2> … <элементN>] опущена, то список команд <список> выполняется один раз для каждого позиционного параметра, который задан.

Рассмотрим пример использования цикла for:

#!/bin/sh

for FILE in $HOME/*.txt

do

cp $FILE ${HOME}/scripts

chmod a+r ${HOME}/texts/${FILE}

done

В приведённом примере все файлы из домашнего каталога пользователя, которые заканчиваются на .txt, копируются в каталог texts и делаются доступными для чтения всем пользователям.

Язык программирования оболочки содержит операторы, нарушающие нормальное выполнение цикла. Эти операторы имеют названия – break (позволяет выполнить безусловный выход из цикла) и continue (приводит к тому, что программа немедленно переходит к следующей итерации цикла без выполнения остальных команд в цикле).

Цикл select

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

select <переменная> [in <элемент1> <элемент2> … <элементN>]

do

<список>

done

При выполнении данного оператора цикла все элементы из списка высвечиваются на экране вместе с их порядковыми номерами, после чего появляется специальное приглашение для ввода. Обычно оно имеет вид #? (стандартное приглашение PS3).

Введённый пользователем номер пункта меню записывается в переменную REPLY, а в <переменную> заносится значение соответствующего <элемента> из списка элементов. Если введена пустая строка, то список для выбора будет выдан заново.

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

Пример:

#!/bin/bash

echo What operating system do you prefer?

select name in "Red Hat Linux" "Ubuntu" "Free BSD" "Other"; do

break

done

if [ $REPLY == 1 ]

then

echo You chose $name. Good choice!

elif [ $REPLY == 2 -o $REPLY == 3 -o $REPLY == 4 ]

then

echo You chose $name.

else

echo You must choose the right number!

fi

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

What operating system do you prefer?

1) Red Hat Linux

2) Ubuntu

3) Free BSD

4) Other

#?

Оболочка ожидает ввода строки на стандартном вводе после символов #?. Нажмите любую из 4 предложенных цифр (1, 2, 3 или 4) и увидите соответствующее сообщение. Если вы, например, введете 1, то увидите сообщение:

You chose Red Hat Linux. Good choice!

При вводе цифры, отличной от 1, 2, 3 или 4, вы увидите сообщение

You must choose the right number!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]