- •Лабораторная работа № 5 «Программирование в командном процессоре ос unix»
- •5.1 Командные процессоры (оболочки)
- •5.2 Переменные в языке программирования bash
- •Использование арифметических вычислений. Операторы let и read
- •Арифметические операторы оболочки bash
- •5.3 Метасимволы и их экранирование
- •5.4 Командные файлы и функции
- •5.4.1 Передача параметров в командные файлы и специальные переменные
- •5.4.3 Управление последовательностью действий в командных файлах
- •5.4.2 Использование команды getopts
- •5.5 Оператор цикла for
- •5.6 Оператор выбора case
- •5.7 Условный оператор if
- •5.8 Операторы цикла while и until
- •5.9 Прерывание циклов
- •Задание на лабораторную работу
- •Контрольные вопросы
5.8 Операторы цикла while и until
В обобщенной форме оператор цикла while выглядит следующим образом:
while список-команд do список-команд done
Выполнение оператора цикла while сводится к тому, что сначала выполняется последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово while, а затем, если последняя выполненная команда из этой последовательности команд возвращает нулевой код завершения ("истина"), выполняется последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово do, после чего осуществляется безусловный переход на начало оператора цикла while. Выход из цикла будет осуществлен тогда, когда последняя выполненная команда из последовательности команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово while, возвратит ненулевой код завершения ("ложь"). Приведенный ниже фрагмент командного файла иллюстрирует использование оператора цикла while. В нем реализуется ожидание события, состоящего в удалении файла с определенным именем, и только после наступления этого события производятся дальнейшие действия. Командный файл, продемонстрированный в приведенном примере, по сути дела является простейшей реализацией механизма синхронизации взаимодействующих процессов на основе семафоров.
while test -f lockfile do sleep 30 echo waiting for semaphore done :create the semaphore file echo > lockfile :further commands and after them delete the semaphore file rm lockfile
При замене в операторе цикла while служебного слова while на until условие, при выполнении которого осуществляется выход из цикла, меняется на противоположное. В остальном оператор цикла while и оператор цикла until идентичны. В обобщенной форме оператор цикла until выглядит следующим образом:
until список-команд do список-команд done
Следующие две команды ОС UNIX, рассмотренные ниже, используются только совместно с управляющими конструкциями языка программирования bash: это команда true, которая всегда возвращает код завершения, равный нулю (т.е. "истина”), и команда false, которая всегда возвращает код завершения, не равный нулю (т. е. "ложь"). Ниже приведены два примера, иллюстрирующие бесконечные циклы, которые будут выполняться до тех пор, пока ЭВМ не сломается или не будет выключена (ну, по крайней мере, до тех пор, пока Вы не нажмете клавишу, соответствующую специальному символу INTERRUPT).
while true do echo hello andy done
until false do echo hello mike done
5.9 Прерывание циклов
Два несложных способа позволяют вам прерывать циклы в оболочке bash. Команда break завершает выполнение цикла, а команда continue завершает данную итерацию блока операторов. Команда break полезна для завершения цикла while в ситуациях, когда условие перестает быть правильным. Пример бесконечного цикла while, с прерыванием в момент, когда файл перестает существовать:
while true do if [! -f $file] then break fi sleep 10 done
Команда continue используется в ситуациях, когда больше нет необходимости выполнять блок операторов, но вы можете захотеть продолжить проверять данный блок на других условных выражениях. Пример предназначен для игнорирования файла /dev/null в любом их списке:
while file=$filelist[$i] (( $i < ${#filelist[*]} )) do if [ "$file" == “dev/null"] then continue fi action done
Эта программа пропускает нужное значение, но продолжает тестировать остальные.
В качестве еще одного примера командного файла приведем команду man. Если Вы уже использовали команду man, то у Вас могло создаться ошибочное впечатление, что эта команда реализована в виде выполняемой программы. Получить на терминале вариант команды man, используемый в Вашей версии ОС UNIX, можно по команде cat /bin/man или cat /usr/bin/man, сравните его с тем вариантом команды man, который приводится здесь:
cd /usr/man :default nroff ($N), section 1 ($s) N=n s=1 for i do case $i in [1-9]) s=$i;; -t) N=t;; -n) N=n;; -*) echo unknown flag \'$i\’;; *) if test -f man$s/$i.$s then ${N}roff man0/${N}aa man$s/$i.$s else :look through all manual sections found = no for j in 1 2 3 4 5 6 7 8 9 do if test -f man$j/$i.$j then man $j $i found = yes fi done case $found in no) echo “$i: manual page not found” esac fi esac done
