$ [ -х scores.txt ]
$ echo $?
1
Нет, не является, что и следовало ожидать после изучения списка прав доступа для файла scores.txt.
В следующем примере проверяется существование каталога appsbin.
drwxr‑xr‑x 2 dave admin 1024 May 15 15:53 appsbin
$ [ -d appsbin ]
$ echo $?
0
Ответ утвердительный, каталог appsbin присутствует. Чтобы проверить, установлен ли бит suid, примените:
-rwsr‑x--- 1 root root 28 Apr 30 13:12 xab
$ [ -u xab ]
$ echo $?
0
Из этого примера следует, что бит suid установлен.
17.2. Применение логических операторов при осуществлении проверки
Итак, проверка прав доступа к файлу была осуществлена, но иногда возникает необходимость в сравнении различных прав доступа. Чтобы реализовать подобную проверку интерпретатор shell предлагает три типа логических операторов;
-a
Логическое AND, возвращает истину, если обе части оператора принимают истинное значение
-o
Логическое OR, возвращает истину, если какая‑либо из частей оператора может принимать истинное значение
!
Логическое NOT, возвращает истину, если условие ложно
А теперь выполним сравнение следующих файлов:
-rw‑r--r-- 1 root root 0 May 15 11:29 scores.txt
-rwxr‑xr—- 1 root root 0 May 15 11:49 results.txt
В следующем примере проверяется, установлены ли для файлов права чтения.
$ [ -w results.txt -a -w scores.txt ]
$ echo $?
0
Ответ звучит утвердительно.
Чтобы проверить, установлены ли для какого‑либо из файлов права выполнения, воспользуйтесь логическим оператором OR.
$ [ -х results.txt -о -x scores.txt ]
$ echo $?
0
Файл scores.txt не является исполняемым, а файл results.txt — исполняемый. Чтобы проверить, установлены ли для файла results.txt права записи и выполнения, примените следующую команду:
$ [ -w results.txt -a -x results.txt ]
$ echo $?
0
В данном случае получается утвердительный ответ.
17.3. Проверка строк
Проверка строк является важным этапом при отслеживании ошибок. Значение этого этапа повышается, если проверяются вводимые пользователями данные либо выполняется сравнение переменных. Чтобы проверить строки, достаточно выбрать один из пяти форматов.
test "строка"
test оператор_строки "строка"
test "строка" оператор_строки "строка"
[ оператор_строки строка ]
[ строка оператор_строки строка ]
Здесь в качестве выражения оператор_строки могут использоваться следующие операторы:
== Две строки равны
!= Две строки не равны
-z Эта строка нулевая
-n Эта строка не является нулевой
Чтобы проверить, присвоено ли переменной среды editor нулевое значение, примените команду:
$ [ -х $EDITOR ]
$ echo $?
1
Ответ отрицательный. Присвоено ли этой переменной значение vi?
$ [ $EDITOR= "vi" ]
$ echo $?
0
Ответ утвердительный. Отобразим это значение на экране:
$ echo $EDITOR
vi
Проверить, равны ли значения переменных таре и таре2, можно, воспользовавшись следующей командой:
$ TAPE="/dev/rmt0"
$ TAPE2="/dev/rmt1"
$ [ "$TAPE" = "$ТАРЕ2" ]
$ echo $?
1
Ответ отрицательный. При присваивании переменных необязательно применять двойные кавычки. Но при сравнении строк использование двойных кавычек является непременным условием.
Чтобы проверить "неравенство" переменных таре и таре2, примените следующую команду:
$ [ »$TAPE" != "$ТАРЕ2" ]
$ echo $?
0
Значения этих переменных не равны.
17.4. Проверка чисел
Для сравнения чисел можно воспользоваться операторами другого рода. Общий формат:
"число" числовой_оператор "число" или
[ "число" числовой_оператор "число" ]
где в качестве выражения числовой_оператор могут фигурировать следующие операторы:
-eq
Два числа равны
-ne
Два числа не равны
-gt
Первое число больше второго числа
-lt
Первое число меньше второго числа
-le
Первое число меньше или равно второму числу
-gt
Первое число больше или равно второму числу
Выясним, равно ли одно число другому (в данном случае рассматривается, равно ли число 130 числу 130):
$ NUMBER=130
$ [ "$NUMBER" -eq "130" ]
$ echo $?
0
Превосходно! Результатом сравнения явилось значение "истина". Теперь изменим второе число и проверим, отобразится ли сообщение об ошибке. Возвращается значение 1 (130 не равно 100(.
$ [ "$NUMBER" —eq "100" ] $ echo $?
1
Чтобы проверить, является ли число 130 больше числа 100, воспользуйтесь следующей командой:
$ [ "$NUMBER" —gt "100" ]
$ echo $?
0
Ответ утвердительный.
Так же можно проверять два целых значения переменных. Ниже уточняется, будет ли значение переменной DEST_COUNT большим, чем значение переменной SOURCE_COUNT.
$ SOURCE_COUNT=13
$ DEST_COUNT-15
$ [ "$DEST_COUHT" -gt "$SOURCE_COUNT" ]
$ echo $?
0
Необязательно для выполнения проверки обращаться к переменной: можно сравнивать и числа, но в этом случае следует применять кавычки:
$ [ "990" -le "995" ] $ echo $?
0
Можно также комбинировать и тестировать выражения с помощью логических операторов. При этом следует пользоваться только одной парой квадратных скобок — не применяйте две пары скобок. Если не учитывать этого замечания, отобразится сообщение об ошибке — "too many arguments" (слишком много аргументов):
$ [ "990" -le "995" ] —а [ "123" —gt "33" ]
sh:[: too many arguments
В следующем примере проверяются два выражения. Если оба выражения истинны, результат будет истинным. Ниже приводится корректный метод выполнения проверки.
$ [ "990" -le "995" -a "123" -gt "33" ] $ echo $?
0
17.5. Применение команды expr
Команда expr используется в основном для проверки целочисленных значений, но может применяться также и при обработке строк. Общий формат команды expr:
expr аргумент оператор аргумент
Команду expr удобно использовать для подсчета количества строк:
$ expr 10 + 10
20
$ expr 900 + 600
1500
$ expr 30/3
10
$ expr 30/3/2
5
В случае применения знака умножения, можно с помощью обратной косой черты отменить его значение- Если этого не сделать, интерпретатор команд может неверно определить значение символа *:
$ expr 30 \*.3
90
17.5.1. Приращение переменной цикла
Команда expr выполняет приращение переменной цикла. Сначала переменной цикла присваивается начальное значение нуль. Затем добавляется единица. Кавычки применяются для обозначения подстановки команд. Выводимые данные, полученные с помощью команды expr, присваиваются переменной цикла.
$ loop=0