Операторы цикла while и until 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операторы цикла 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

Прерывание циклов

 

Два несложных способа позволяют вам прерывать циклы в оболочке 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

 

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ

1. Используя команды getopts grep написать командный файл, который анализирует командную строку с ключами:

· -iinputfile – прочитать данные из указанного файла

· -ooutputfile – вывести данные в указанный файл

· -pшаблон – указать шаблон для поиска

· -С – различать большие и малые буквы

· -n – выдавать номера строк,

а затем ищет в указанном файле нужные строки, определяемые ключом -p.

2. Написать на языке Си программу, которая вводит строку символов и определяет, чем является эта строка – целым числом, вещественным, датой или текстовой строкой. Затем программа завершается с помощью функции exit(n), передавая информацию в о коде завершения в оболочку. Командный файл должен вызывать эту программу и, проанализировав с помощью команды $? код возврата, выдавать сообщение о том какое число было введено.

3. Написать пример командного файла, обрабатывающего более 10 входных аргументов.

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

5. Написать командный файл, реализующий упрощенный механизм семафоров. Командный файл должен в течение некоторого времени t1 дожидаться освобождения ресурса, выдавая об этом сообщение, а дождавшись его освобождения использовать его в течение некоторого времени t2<>t1, также выдавая информацию о том, что ресурс используется соответствующим командным файлом (процессом). Запустить командный файл в одном виртуальном терминале в фоновом режиме, перенаправив его вывод в другой (>/dev/tty#, где # – номер терминала куда перенаправляется вывод), в котором также запущен этот файл, но не фоновом, а в привилегированном режиме. Доработать программу так, чтобы имелась возможность взаимодействия трех и более процессов.

6. Реализовать команду man с помощью командного файла.

 

Контрольные вопросы

1.  Объясните понятие командных оболочек

2.  Что такое POSIX?

3.  Как определяются переменные и массивы в языке программирования bash?

4.  Каково назначение операторов let и read?

5.  Какие арифметические операции можно применять в языке программирования bash?

6.  Что означает операция (())?

7.  Какие стандартные имена переменных вы знаете?

8.  Что такое метасимволы?

9.  Как экранировать метасимволы?

10.  Как создать и запускать командные файлы?

11.  Как определяются функции в языке программирования Bash?

12.  Каким образом Вы можете выяснить является файл каталогом или обычным файлом?

13.  Каково назначение команд set, typset и unser?

14.  Как передаются параметры в командные файлы?

15.  Назовите специальные переменные языка bash и их назначение.

16.  Каково предназначение команды getopts?

17.  Какое отношение метасимволы имеют к генерации имен файлов?

18.  Какие операторы управления действиями Вы знаете?

19.  Какие операторы используются для прерывания цикла?

20.  Для чего нужны команды false и true?

21.  Что означает строка if test –f manSs/Si.Ss встреченная в командном файле?



Поделиться:


Последнее изменение этой страницы: 2021-01-14; просмотров: 253; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.96.146 (0.008 с.)