Цель работы: освоить использование операторов цикла.
Оператор for работает немного не так, как в обычных языках программирования. Вместо того, чтобы организовывать увеличение или уменьшение на единицу значения некоторой переменной при каждой итерации, он при каждом проходе цикла присваивает переменной очередное значение из заданного списка слов. Синтаксис:
for parameter [in value]
commands
Если часть 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 ))
commands
Сначала вычисляется арифметическое выражение 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 условие
команды
Пример:
while [ -d mydirectory ]
do
ls -1 mydirectory >> logfile
echo -- SEPARATOR —- >> logfile
sleep 60
done
Программа будет протоколировать содержание каталога mydirectory ежеминутно до тех пор, пока каталог существует.
Для работы с числовыми значениями можно использовать C-подобный синтаксис оператора while:
while ((условие))
команды
Пример:
((a=1,max=10))
while ((a<=max)) do
echo -n "$a "
((a+=1))
done
Оператор until имеет структуру, аналогичную оператору while:
until условие
команды
Оператор выполняет условие и, если оно возвращает ненулевой код возврата, то выполняются команды. Процедура повторяется до тех пор, пока код завершения условия не станет нулевым. C-подобный синтаксис команды until аналогичен синтаксису оператора while.
В циклах сценария можно использовать команды break и continue. Первая осуществляет выход из текущего цикла, вторая начинает новую итерацию цикла.
1. Создайте сценарий myscript11, выполняющий создание резервных копий файлов текущей директории. Имена копий получаются добавлением .bak к имени файла. Копии помещаются в подкаталог BAK текущего каталога (осуществите в сценарии проверку существования такого каталога и при необходимости укажите команду его создания).
2. Создайте сценарий myscript12, выполняющий подсчет количества файлов в текущей директории без использования команды wc.
3. Создайте сценарий myscript13, выводящий на экран числа от 1 до 50.
4. Создайте сценарий myscript14, выполняющий последовательный поиск файлов, содержащих в именах буквосочетания, указанные в качестве аргументов сценария.
7. Создайте сценарий myscript17, запрашивающий двузначное число — количество часов. В зависимости от введенного числа, сценарий должен выдавать сообщения:
«Morning», если введено 4-11;
«Afternoon», если введено 12-15;
«Evening», если введено 16-22;
«Night», если введено 0-3, 23, 24.
Если введено число вне диапазона 0…24, выдать предупреждение и снова запросить число.
8. Изменить сценарий предыдущего задания, добавив проверку ввода нечисловых значений: если было введено не число, выдать предупреждение и выполнить повторный запрос. (Указание. Проверку можно осуществить, например, попыткой выполнения арифметической операции. Если операция будет производиться над нечисловым значением, то код ее завершения будет ненулевым. Системные сообщения об ошибках можно подавить перенаправлением потока ошибок на фиктивное устройство.)