Шрифт:
Пока утилита find(1) производит поиск файла с именем myfile.txt.1, сканируя файловую систему, вы сможете выполнить еще массу полезных дел, например, отправить почту или распечатать документ на принтере. Мы вернемся к этой схеме запуска программ далее в этой главе при обсуждении системы управления заданиями.
Наконец, командный интерпретатор предоставляет возможность условного запуска команд. Например, если необходимо выполнить команду только в случае успешного завершения предыдущей, следует воспользоваться следующей синтаксической конструкцией:
В качестве примера рассмотрим поиск имени пользователя в файле паролей, и в случае успеха — поиск его имени в файле групп:
Успехом считается нулевой код возврата программы, неудачей — все другие значения.
Можно назначить выполнение команды только в случае неудачного завершения предыдущей. Для этого команды следует разделить двумя символами '|':
Приведенный синтаксис является упрощенной формой условного выражения. Командный интерпретатор имеет гораздо более широкие возможности проверки тех или иных условий, которые мы рассмотрим в следующем разделе.
Условные выражения
Язык Bourne shell позволяет осуществлять ветвление программы, предоставляя оператор if. Приведем синтаксис этого оператора:
Команды
Если слово sergey будет найдено программой grep(1) в файле паролей (код возврата grep(1) равен 0), то будет выведено соответствующее сообщение.
Возможны более сложные формы оператора if.
Установим позиционные параметры равными значениям полей вывода программы who(1)
Девятое поле вывода — предыдущий уровень выполнения системы; символ 'S' означает однопользовательский режим
Седьмое поле — текущий уровень
Данный фрагмент скрипта проверяет уровень выполнения, с которого система совершила переход, и текущий уровень выполнения системы. Соответствующие сообщения выводятся на консоль администратора. В этом фрагменте условие генерируется командой test, эквивалентной (и более наглядной) формой которой является "[]". Команда test является наиболее распространенным способом генерации условия для оператора if.
Команда 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) |