Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы OC UNIX_часть3.doc
Скачиваний:
21
Добавлен:
18.04.2015
Размер:
543.23 Кб
Скачать

4.4.Условный оператор if

Оператор if (если)в простейшем виде имеет следующую структуру:

if условие

then список команд 1

else список команд 2

fi

Обратите внимание, что структура обязательно завершается служебным словом fi. Число fi всегда должно соответствовать числу if.

Оператор ifпроверяет значение выражения, которое следует за именем команды, и если значение выражения равно0 (true), выполняет команды междуthen и else; если же значение выражения равно1 (false), выполняется команда, следующая заelse.Частьelse может отсутствовать. Операторifможно использовать в сочетании с командойtestдля проверки существования некоторого файла.

Например:

if test –f file

then (обработка файла)

else (выполнение каких–то иных действий)

fi

4.5. Оператор цикла for

Управляющая конструкция for(для) организует условный цикл и имеет следующий вид:

for имя переменной [in список значений]

do список–команд

done

где for– служебное слово определяющее тип цикла,doиdone – служебные слова, выделяющие тело цикла. Служебные слова пишутся с начала строки. Фрагмент "in список значений" может отсутствовать.

Имя переменной – это переменная оболочки, принимающая по очереди значения из списка при каждом выполнении следующего за служебным словомdoсписка–команд.

Например, скриптlsortсодержит следующие операторы:

for i in f1 f2 f3

do

progsort $i

done

В этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать какshell–переменную, которой последовательно присваиваются перечисленные значения (i=f1, i=f2, i=f3), и выполняется в цикле команда "progsort".

Часто используется форма "for i in *",означающая "для всех файлов текущего каталога".

Пусть "progsort" в свою очередь представляется командным файлом:

cat $1 | sort | tee ${1}_sorted

т.е. последовательно сортируются указанные файлы, результаты сортировки направляются в файлы f1_sorted, f2_sorted и f3_sorted.

Можно сделать более универсальной скрипт lsort, если не фиксировать перечень файлов в команде, а передавать произвольное их число параметрами:

for i

do

progsort $i

done

Здесь отсутствие после "i" служебного слова "in" с перечислением имен говорит о том, что список поступает через параметры команды. Результат предыдущего примера можно получить, набрав:

$ lsort f1 f2 f3

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

Конструкция while(пока) образует цикл, который подлежит выполнению до тех пор, пока командаwhileопределяет условие какtrue.

В операторе whileиспользуется следующий формат:

while список_w

do

список_d

done

где while– служебное слово определяющее тип цикла с истинным условием, а словаdoиdoneслужат маркерами блока. Для того чтобы этот блок был всегда виден, команды в этом списке следует записывать с отступом.

«Список_w» называется «списком while» и состоит из одной или более команд, разделенных точками с запятой или символами новой строки. Эти команды, которые могут содержать аргументы, переназначения, конвейеризацию, вызовы других сценариев и все другие командные механизмы, выполняются как обычно. То, что происходит дальше, зависит от кода завершения последней команды в «списке_w».

Код завершения передается командному процессору и показывает, как выполнилась команда. Обращаться к этому числу можно с помощью специального позиционного параметра $?.

Нулевой статус выхода означает true(т.е. успешное выполнение команды), а ненулевой –false(команда по какой–то причине выполнилась неуспешно). С помощью различных ненулевых статусов программисты могут указывать причину неуспешного выполнения. Истина одна, а ложь многолика.

«Список_d» называется «списком do». Если статус выхода последней команды в «списке_w» являетсяtrue, то выполняются команды в «списке_d» междуdoиdone, а затем управление возвращается командеwhile. «Список_w» выполняется снова и т.д., если статус выхода в «списке_d» примет значениеfalse, то команды в «списке_d» пропускаются, а выполнение возобновляется с команды, следующей за операторомdone.

Оператор цикла untilимеет структуру:

until условие

do

список команд

done

где until– служебное слово определяющее тип цикла с ложным условием. Список команд в теле цикла (междуdoиdone) повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие не должно выполняться.

Отличие от оператора whileсостоит в том, что условие цикла проверяется на ложность (на ненулевой код завершения последней команды тела цикла) после каждого (в том числе и первого!) выполнения команд тела цикла.

Итак, в интерпретаторе shellесть два вида циклов, в которых запускается команда и проверяется ее код завершения. Циклuntilпродолжается, пока команда возвращает ненулевой код, а циклwhile– пока команда возвращает нулевой код. Выбор междуwhileиuntilзависит от типа проверяемого условия. Иногда «положительное» условиеwhileявляется более естественным и более простым в проверке. В других случаях более естественным будет «отрицательное» условиеuntil.

Например,сравните следующие два примера:

while sleep 60

do

who | grep user1

done

until who | grep user1

do

sleep 60

done

Обе эти версии будут каждые 60 с опрашивать список пользователей и смотреть, зарегистрировался ли пользователь user1. Версияuntilимеет то преимущество, что если пользовательuser1зарегистрировался в системе, то выход выполняется немедленно. В версии сwhileдеактивация происходит перед проверкой, и после регистрацииuser1она будет сообщать вам об этом каждую минуту (пока вы ее не прервете, или пока пользовательuser1не выйдет из системы).

Например:

while test –r file1

do sleep 5

done

Эта программа ожидает удаление файла file1, она определяет, читаем ли мыfile1, и если да, то по команде'sleep 5'засыпает на 5 с. После удаленияfile1в результате проверки устанавливается значениеfalse, и выполнение условного оператора заканчивается.