Эти команды в некоторых ранних оболочках 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 для получения дополнительных сведений. Позже в этой главе мы применим некоторые из этих опций.
Теперь, когда вы познакомились с условиями, можно рассмотреть управляющие структуры, использующие эти условия.
В командной оболочке есть ряд управляющих структур или конструкций, похожих на аналогичные структуры в других языках программирования.
Примечание
В следующих разделах элемент синтаксической записи операторы — это последовательности команд, которые выполняются, когда или пока условие удовлетворяется или пока оно не удовлетворяется.
ifУправляющий оператор if очень прост: он проверяет результат выполнения команды и затем в зависимости от условия выполняет ту или иную группу операторов.
if условие
then
операторы
else
операторы
fi
Наиболее часто оператор if применяется, когда задается вопрос, и решение принимается в зависимости от ответа:
#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
if [ $timeofday = "yes" ]; then
echo "Good morning"
else
echo "Good afternoon"
fi
exit 0
В результате будет получен следующий вывод на экран:
Is it morning? Please answer yes or no
yes
Good morning
$
В этом сценарии для проверки содержимого переменной timeofday применяется команда [. Результат оценивается оператором командной оболочки if, который затем разрешает выполнять разные строки программного кода.