Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС лабы / ОС - Лабораторная работа 3.doc
Скачиваний:
60
Добавлен:
01.06.2015
Размер:
469.5 Кб
Скачать
      1. Логические выражения и операторы управления

Для управления порядком выполнения команд в языке shellиспользуются операторы управления, немного напоминающие операторы языкаC. Простейшая форма управления выполнением, связанная с использованием операций&&и||, была описана выше. Как было сказано, в роли логического условия, определяющего ход дальнейшего выполнения, выступает код завершения предыдущей команды или списка команд, при этом «истинной» считается команда, завершившаяся с кодом 0.

Для получения более богатого набора проверяемых условий в ранних версиях UNIXтрадиционно используется встроенная командаtest строка, где строка задает проверяемое условие, которое определяет код возврата командыtest. Вbashможно, кроме того, использовать более приятный синтаксис:строка ], где использование квадратных скобок означает как бы неявный вызов командыtest. Пробелы, отделяющие квадратные скобки от строки условия, в данном случае обязательны.

В следующей таблице описаны синтаксис и семантика строк, задающих логические выражения.

Запись

Проверяемое условие

Условия, связанные с файлами

-b файл

Файл существует и является блочным специальным

-c файл

Файл существует и является символьным специальным

-d файл

Файл существует и является каталогом

-e файл

Файл существует

-f файл

Файл существует и является обычным файлом

-h файл

Файл существует и является символической связью

-r файл

Файл существует и доступен текущему пользователю для чтения

-s файл

Файл существует и имеет ненулевой размер

-t хэндл

Хэндл открыт и соответствует терминалу

-w файл

Файл существует и доступен текущему пользователю для записи

-x файл

Файл существует и доступен текущему пользователю для выполнения

-O файл

Файл существует и принадлежит текущему пользователю

-G файл

Файл существует и принадлежит группе текущего пользователя

-N файл

Файл существует и был изменен после последнего чтения

файл1 –nt файл2

Файл 1 новее (т.е. был изменен позднее), чем файл 2

файл1 –ot файл2

Файл 1 старее (т.е. был изменен раньше), чем файл 2

файл1 –ef файл2

Оба имени ссылаются на один и тот же файл (как жесткие ссылки)

Условия, связанные со строками

-z строка

Строка пуста (имеет нулевую длину)

-n строка

Строка непустая

строка

Строка непустая

строка1 = строка2

Строки равны

строка1 == строка2

Строки равны

строка1 != строка2

Строки не равны

строка1 < строка2

Строка 1 меньше (в словарном смысле), чем строка 2

строка1 > строка2

Строка 1 больше (в словарном смысле), чем строка 2

Условия, связанные с числами

число1 ОП число2

Операция сравнения ОПможет быть любой из следующих:

-eq(равно), -ne(не равно), -lt(меньше), -le(меньше либо равно), -gt(больше), -ge(больше либо равно).

Логические связки

! выражение

Инверсия (логическое отрицание)

выраж1 -a выраж2

Конъюнкция (логическое И)

выраж1 -o выраж2

Дизъюнкция (логическое ИЛИ)

В приведенной таблице строка,файл,число– это строковые выражения (возможно, содержащие переменные, специальные параметры, разного вида кавычки и т.п.). При этом строкафайлрассматривается как имя файла, а строкачислодолжна представлять собой запись целого числа, возможно, со знаком.

При вычислении логических выражений более высокий приоритет имеют первичные операции (связанные с файлами, строками и числами), затем инверсия, конъюнкция и дизъюнкция. Для изменения порядка операций можно использовать круглые скобки.

Еще один способ построения сложных условий связан с использованием списков команд. Напомним, что любая команда, помимо своей основной работы, вырабатывает код завершения – нулевой («истина») или ненулевой («ложь»). Команда test(или[]) ничего другого и не делает. Имеются, кроме того, специальные встроенные командыtrueиfalse, которые могут использоваться как логические константы. Таким образом, список команд, разделенных связками!(отрицание),&&(конъюнкция) и||(дизъюнкция), является своеобразным логическим выражением, значение которого может быть использовано в описанных ниже операторах управления. Рассмотрим, например, следующий список команд:

[ -x my_prog ] && my_prog && [ $a –ge 4 ]

Этот список будет «истинным» (т.е. выдаст нулевой код завершения), только если в текущем каталоге существует выполнимый файл (программа или скрипт) my_prog, вызов этой программы завершается с нулевым кодом, а значением переменнойaявляется строка, представляющая целое число не менее 4. Если же файлmy_progне существует или недоступен для выполнения, то не будет делаться безнадежной попытки запустить его на выполнение и не будет проверяться значение переменнойa, а результатом выполнения всего списка будет «ложь».

Использование условий, выражаемых кодами завершения команд, дает возможность применить описанные ниже управляющие операторы языка shell, которые формально являются встроенными командамиshell, однако отличаются особым синтаксисом и специальным назначением. Следует отметить, что кодом завершения каждого из описанных ниже операторов будет либо код завершения последней выполненной команды, либо 0, если ни одна команда не была выполнена.