Книга: Основы программирования в Linux
Условия
Разделы на этой странице:
Условия
Основа всех языков программирования — средства проверки условий и выполнение различных действий с учетом результатов этой проверки. Но прежде чем говорить об этом, давайте рассмотрим условные конструкции, которые можно применять в сценариях командной оболочки, а затем познакомимся с использующими их управляющими структурами.
Сценарий командной оболочки может проверить код завершения любой команды, вызванной из командной строки, включая сценарии, написанные вами. Вот почему так важно всегда включать в создаваемые вами сценарии команду exit с определенным значением.
Команда test или [
На практике в большинстве сценариев широко используется команда [
или test
— логическая проверка командной оболочки. В некоторых системах команды [
и test
— синонимы, за исключением того, что при использовании команды [
для удобочитаемости применяется и завершающая часть ]
. Наличие команды [
может показаться странным, но в программном коде она упрощает синтаксис и делает его более похожим на другие языки программирования.
Примечание
Эти команды в некоторых ранних оболочках UNIX вызывают внешнюю программу, но в более современных версиях их стараются делать встроенными. Мы вернемся к этому, когда будем рассматривать команды в следующем разделе.
Поскольку команда test
не часто применяется за пределами сценариев командной оболочки, многие пользователи ОС Linux, никогда раньше не писавшие сценариев, пытаются создавать простые программы и называют их test. Если такая программа не работает, вероятно, она конфликтует с командой оболочки test
. Для того чтобы выяснить, есть ли в вашей системе внешняя команда с данным именем, попытайтесь набрать что-нибудь вроде which test
и проверить, какая именно команда test
выполняется в данный момент, или используйте форму ./test
, чтобы быть уверенным в том, что вы выполняете сценарий из текущего каталога. Если сомневаетесь, примите за правило выполнять свои сценарии, предваряя при запуске их имена комбинацией символов ./
.
Мы представим команду test
на примере одного простейшего условия: проверки наличия файла. Для нее понадобится следующая команда: test -f <имя_файла>
, поэтому в сценарии можно написать
if test -f fred.c
then
...
fi
To же самое можно записать следующим образом:
if [ -f fred.c ]
then
...
fi
Код завершения команды test
(выполнено ли условие) определяет, будет ли выполняться условный программный код.
Примечание
Имейте в виду, что вы должны вставлять пробелы между квадратной скобкой [
и проверяемым условием. Это легко усвоить, если запомнить, что вставить символ [
— это все равно, что написать test
, а после имени команды вы всегда должны вставлять пробел.
Если вы предпочитаете помещать слово then
в той же строке, что и if
, нужно добавить точку с запятой для отделения команды test
от then
:
if [ -f fred.c ]; then
...
fi
Варианты условий, которые вы можете применять в команде test
, делятся на три типа: строковые сравнения, числовые сравнения и проверка файловых флагов (file conditionals). Эти типы условий описаны в табл. 2.4.
Таблица 2.4
Варианты условий | Результат |
---|---|
Сравнения строк | |
Строка1 = Строка2 |
True (истина), если строки одинаковы |
Строка1 != Строка2 |
True (истина), если строки разные |
-n Строка |
True (истина), еслиСтрока не null |
-z Строка |
True (истина), еслиСтрока null (пустая строка) |
Сравнения чисел | |
Выражение1 -eq Выражение2 |
True (истина), если выражения равны |
Выражение1 -ne Выражение2 |
True (истина), если выражения не равны |
Выражение1 -gt Выражение2 |
True (истина), еслиВыражение1 больше, чемВыражение2 |
Выражение1 -ge Выражение2 |
True (истина), еслиВыражение1 не меньшеВыражение2 |
Выражение1 -lt Выражение2 |
True (истина), еслиВыражение1 меньше, чемВыражение2 |
Выражение1 -lе Выражение2 |
True (истина), еслиВыражение1 не большеВыражение2 |
! Выражение |
True (истина), еслиВыражение ложно, и наоборот |
Файловый флаг | |
-d файл |
True (истина), еслифайл — каталог |
-е файл |
True (истина), еслифайл существует. Исторически, опция -e не была переносима на другие платформы, поэтому обычно применяется -f |
-f файл |
True (истина), еслифайл — обычный файл |
-g файл |
True (истина), если дляфайла установлен бит set-group-id |
-r файл |
True (истина), если файл доступен для чтения |
-s файл |
True (истина), если файл ненулевого размера |
-u файл |
True (истина), если дляфайла установлен бит set-user-id |
-v файл |
True (истина), еслифайл доступен для записи |
-х файл |
True (истина), если файл — исполняемый файл |
Примечание
Вас могли заинтересовать непонятные биты set-group-id и set-user-id (также называемые set-gid и set-uid). Бит set-uid предоставляет программе права владельца, а не просто ее пользователя, бит set-gid предоставляет программе права группы. Эти биты устанавливаются командой chmod
с помощью опций s и g
. На файлы, содержащие сценарии, флаги set-gid и set-uid не влияют, они оказывают влияние только на исполняемые двоичные файлы.
Мы немного сами себя обогнали, но далее следует пример тестирования состояния файла /bin/bash, так что вы сможете увидеть, как это выглядит на практике.
#!/bin/sh
if [ -f /bin/bash ]
then
echo "file /bin/bash exists"
fi
if [ -d /bin/bash ]
then
echo "/bin/bash is a directory"
else
echo "/bin/bash is NOT a directory"
fi
Для того чтобы тест мог оказаться истинным, предварительно, для проверки всех файловых флагов требуется наличие файла. Данный перечень включает только самые широко используемые опции команды test
, полный список можно найти в интерактивном справочном руководстве. Если вы применяете оболочку bash, в которую встроена команда test
, используйте команду help test
для получения дополнительных сведений. Позже в этой главе мы применим некоторые из этих опций.
Теперь, когда вы познакомились с условиями, можно рассмотреть управляющие структуры, использующие эти условия.
- 11.2. Технология принятия решения в условиях чрезвычайной ситуации
- Условия CHECK
- Условия копирования, распространения и модификации программных продуктов
- Предусловия и постусловия
- Условия поиска
- 1.3. Информационная безопасность в условиях функционирования в России глобальных сетей
- Постусловия
- Как применить эти условия договора к своим новым программам
- Использование идентификатора UID в качестве условия
- ОПЕРАЦИЯ УСЛОВИЯ: ?:
- Какие условия при продаже по телефону должны совпасть, чтобы покупка состоялась
- Перехват клиента. Борьба за продажи в условиях жесткой конкуренции