Поскольку команда 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 не влияют, они оказывают влияние только на исполняемые двоичные файлы.
Читать дальше