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

Лабораторная работа №14. Циклические конструкции

Цель работы: освоить использование операторов цикла.

Необходимые сведения

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

for parameter [in value]

do

commands

done

Если часть in value присутствует, то parameter при каждой итерации цикла принимает значение из списка value. В качестве такого списка могут выступать:

  • текстовая строка значений с разделителями;

  • подстановки значений параметров. Пусть до цикла было выполнено присваивание a="One Two Three", тогда при указании in $a тело цикла выполнится три раза со значениями parameter соответственно One, Two, Three;

  • шаблоны имен файлов. Например, при указании in ~/sources/*.c тело цикла выполнится для каждого файла с расширением *.c каталога sourсe домашнего каталога.

Если часть in value пропущена, то тело цикла выполняется один раз для каждого позиционного параметра. Правила построения списков команд commands такие же, как и в операторе if.

Пример:

for a in 1 2 3 4

do

mkdir Temp_${a}

done

В приведенном примере создаются каталоги Temp_1,…,Temp_4

Пример:

for a in *.txt

do

cp ${a} ./Backup

echo “File $a copied”

done

В примере происходит резервное копирование txt-файлов и вывод соответствующих сообщений.

В Linux имеется команда seq, которая выводит последовательность чисел. Синтаксис:

seq начальное_число шаг конечное_число.

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

for a in $(seq 1 1 10)

do

cat file_$a

done

На экран выводится содержимое десяти файлов: file_l,…, file_10.

Вместо команды seq можно воспользоваться так называемым C-подобным синтаксисом оператора for:

for (( expr1 ; expr2 ; expr3 ))

do

commands

done

Сначала вычисляется арифметическое выражение expr1. Тело цикла будет повторяться до тех пор, пока код завершения арифметического выражения expr2 является нулевым. Если expr2 возвращает ненулевой код, вычисляется expr3. Если какое-либо из выражений expr1, expr2, expr3 опущено, то считается, что код завершения этого выражения равен 1. Пример:

for (( i=1 ; i<=10 ; i++ ))

do

cat file_$i

done

Примечание. Внутри двойных круглых скобок нет необходимости перед именем числовой переменной указывать символ $. В expr1 и expr2 можно указывать несколько действий через символ , (запятая). Кроме того, в последних версиях bash при использовании C-синтаксиса жестко не регламентируется использование пробелов, поэтому часть for в предыдущем примере можно записать в виде for ((i=1;i<=max;i++)).

Оператор while работает подобно if , только выполнение операторов из списка циклически продолжается до тех пор, пока верно условие, и прерывается, если условие не верно. Синтаксис:

while условие

do

команды

done

Пример:

while [ -d mydirectory ]

do

ls -1 mydirectory >> logfile

echo -- SEPARATOR —- >> logfile

sleep 60

done

Программа будет протоколировать содержание каталога mydirectory ежеминутно до тех пор, пока каталог существует.

Для работы с числовыми значениями можно использовать C-подобный синтаксис оператора while:

while ((условие))

do

команды

done

Пример:

((a=1,max=10))

while ((a<=max)) do

echo -n "$a "

((a+=1))

done

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

until условие

do

команды

done

Оператор выполняет условие и, если оно возвращает ненулевой код возврата, то выполняются команды. Процедура повторяется до тех пор, пока код завершения условия не станет нулевым. C-подобный синтаксис команды until аналогичен синтаксису оператора while.

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

Ход работы

  1. Создайте сценарий myscript11, выполняющий создание резервных копий файлов текущей директории. Имена копий получаются добавлением .bak к имени файла. Копии помещаются в подкаталог BAK текущего каталога (осуществите в сценарии проверку существования такого каталога и при необходимости укажите команду его создания).

  2. Создайте сценарий myscript12, выполняющий подсчет количества файлов в текущей директории без использования команды wc.

  3. Создайте сценарий myscript13, выводящий на экран числа от 1 до 50.

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

  5. Используя оператор while, создайте сценарий myscript15, выполняющий действия, аналогичные заданию 3.

  6. Используя оператор until, создайте сценарий myscript16, выполняющий действия, аналогичные заданию 3.

  7. Создайте сценарий myscript17, запрашивающий двузначное число — количество часов. В зависимости от введенного числа, сценарий должен выдавать сообщения:

«Morning», если введено 4-11;

«Afternoon», если введено 12-15;

«Evening», если введено 16-22;

«Night», если введено 0-3, 23, 24.

Если введено число вне диапазона 0…24, выдать предупреждение и снова запросить число.

  1. Изменить сценарий предыдущего задания, добавив проверку ввода нечисловых значений: если было введено не число, выдать предупреждение и выполнить повторный запрос. (Указание. Проверку можно осуществить, например, попыткой выполнения арифметической операции. Если операция будет производиться над нечисловым значением, то код ее завершения будет ненулевым. Системные сообщения об ошибках можно подавить перенаправлением потока ошибок на фиктивное устройство.)