- •И.Н.Акуленок
- •Утверждено советом университета
- •Введение
- •Глава 1. Текстовые редакторы
- •1.1. Редактор ed
- •1.1.1. Команды, не использующие адресации строк
- •1.1.2. Команды, использующие один адрес
- •1.1.3. Команды, использующие два адреса
- •1.1.4. Нумерация строк
- •1.1.5. Примеры использования команд
- •1.2. Редактор VI и ex
- •1.2.1. Редактирование нескольких файлов
- •1.2.2. Вставка текста из одного файла в другой
- •1.3. Потоковый редактор sed
- •1.4. Контрольные вопросы
- •Глава 2. Командные процессоры ос unix
- •2.1. Типы командных процессоров
- •2.2. Идентификация и смена оболочки
- •2.3. Запуск shell и стартовых shell–файлов
- •2.4. Установка переменных среды
- •2.5. Псевдонимы команд
- •2.6. Выполнение .Profile после его изменения
- •2.7. Контрольные вопросы
- •Глава 3. Интерпретатор shell
- •3.1. Shell–переменные
- •3.1.1. Задание значений переменных и их отмена
- •3.1.2. Экспорт переменных
- •3.2. Специальные символы
- •3.2.1. Использование двойных кавычек и апострофа
- •3.2.2. Обратные апострофы
- •3.2.3. Обратная наклонная черта
- •3.3. Позиционные переменные
- •3.4. Код завершения процесса
- •3.5. Конвейеры и списки
- •3.6. Композиции команд
- •3.5.1. Порожденный shell – оператор круглые скобки ( )
- •3.5.2. Оператор списка – фигурные скобки {}
- •3.6. Контрольные вопросы
- •Глава 4. Программные структуры
- •4.1. Команда test
- •4.1.1. Условия проверки файлов
- •4.1.2. Условия проверки строк
- •4.1.3. Условия сравнения целых чисел
- •4.1.4. Сложные условия
- •4.2. Команда expr
- •4.3. Команда read
- •4.4.Условный оператор if
- •4.5. Оператор цикла for
- •4.6. Операторы цикла while и until
- •4.7. Оператор вызова case
- •4.8. Функции в shell
- •4.9. Контрольные вопросы
- •5. Создание сценария командного процессора
- •5.1. Пример простейшего сценария
- •5.2. Основные этапы разработки сценария
- •5.3. Отладка командных процедур
- •5.4. Выполнение shell–программ
- •5.5. Создание новых команд
- •5.6. Контрольные вопросы
- •Список литературы
- •Оглавление
- •Акуленок Ирина Николаевна
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, и выполнение условного оператора заканчивается.