Операционная система UNIX - страница 35

стр.

>$ grep sergey /etc/passwd && grep sergey /etc/group

Успехом считается нулевой код возврата программы, неудачей — все другие значения.

Можно назначить выполнение команды только в случае неудачного завершения предыдущей. Для этого команды следует разделить двумя символами '|':

>$ cmd1 || echo Команда завершилась неудачно

Приведенный синтаксис является упрощенной формой условного выражения. Командный интерпретатор имеет гораздо более широкие возможности проверки тех или иных условий, которые мы рассмотрим в следующем разделе.

Условные выражения

Язык Bourne shell позволяет осуществлять ветвление программы, предоставляя оператор if. Приведем синтаксис этого оператора:

>if условие

>then

> command1

> command2

> ...

>fi

Команды >command1, >command2 и т.д. будут выполнены, если истинно >условие. Условие может генерироваться одной или несколькими командами. По существу, ложность или истинность условия определяется кодом возврата последней выполненной команды. Например:

>if grep sergey /etc/passwd >/dev/null 2>&1

>then

> echo пользователь sergey найден в файле паролей

>fi

Если слово sergey будет найдено программой grep(1) в файле паролей (код возврата grep(1) равен 0), то будет выведено соответствующее сообщение.

Возможны более сложные формы оператора if.

>set `who -r`

Установим позиционные параметры равными значениям полей вывода программы who(1)

>if [ "$9" = "S" ]

Девятое поле вывода — предыдущий уровень выполнения системы; символ 'S' означает однопользовательский режим

>then

> echo Система загружается

>elif [ "$7" = "2" ]

Седьмое поле — текущий уровень

> echo Переход на уровень выполнения 2

>else

> echo Переход на уровень выполнения 3

>fi

Данный фрагмент скрипта проверяет уровень выполнения, с которого система совершила переход, и текущий уровень выполнения системы. Соответствующие сообщения выводятся на консоль администратора. В этом фрагменте условие генерируется командой test, эквивалентной (и более наглядной) формой которой является "[]". Команда test является наиболее распространенным способом генерации условия для оператора if.

Команда test

Команда test имеет следующий синтаксис:

>test выражение

или

>[ выражение ]

Команда вычисляет логическое выражение (табл. 1.10) и возвращает 0, если выражение истинно, и 1 в противном случае.


Таблица 1.10. Выражения, используемые в команде test

Выражения с файлами
>-s fileРазмер файла >file больше 0
>-r fileДля файла >file разрешен доступ на чтение
>-w fileДля файла >file разрешен доступ на запись
>-x fileДля файла >file разрешено выполнение
>-f fileФайл >file существует и является обычным файлом
>-d fileФайл >file является каталогом
>-с fileФайл >file является специальным файлом символьного устройства
>-b fileФайл >file является специальным файлом блочного устройства
>-р fileФайл >file является поименованным каналом
>-u fileФайл >file имеет установленный флаг SUID
>-g fileФайл >file имеет установленный флаг SGID
>-k fileФайл >file имеет установленный флаг sticky bit
Выражения со строками
>-z stringСтрока >string имеет нулевую длину
>-n stringДлина строки >string больше 0
>string1 = string2Две строки идентичны
>string1 != string2Две строки различны
Сравнение целых чисел
>i1 -eq i2>i1 равно >i2
>i1 -ne i2>i1 не равно >i2
>i1 -lt i2>i1 строго меньше >i2
>i1 -le i2>i1 меньше или равно >i2
>i1 -gt i2>i1 строго больше >i2
>i1 -ge i2>i1 больше или равно >i2

Более сложные выражения могут быть образованы с помощью логических операторов:

>!выражениеИстинно, если выражение ложно (оператор NOT)
>выражение1выражение2Истинно, если оба выражения истинны (оператор AND)
>выражение1 -o выражение2Истинно, если хотя бы одно из выражений истинно (оператор OR)

Приведем несколько примеров использования выражений.

Фрагмент скрипта, используемый при регистрации нового пользователя. Скрипт проверяет наличие в домашнем каталоге инициализационного скрипта .profile и в случае его отсутствия копирует шаблон:

>if [ ! -f $НОМЕ/.profile ]

>then

> echo "файла .profile не существует - скопируем шаблон"

> cp /usr/lib/mkuser/sh/profile $НОМЕ/.profile

>fi

Фрагмент скрипта, проверяющего наличие новой почты в почтовом ящике пользователя

>if [ -s $MAIL ]

>then

> echo "Пришла почта"

>fi

Фрагмент скрипта инициализации системы — запуска "суперсервера" Internet