Test-строка в bash и sh

Установка, настройка, эксплуатация.
Ответить
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Test-строка в bash и sh

Сообщение root »

Автор: Angel2S2
Источник
Дата публикации: 1 июля 2009, 14:05


Довольно часто бывает нужно, когда пишешь скрипт проверить если ли файл, какой он, строка пустая, а число больше нуля или нет?.. Для этого предусмотрена test-строка. Это внешняя утилита. Так же сразу можешь заглянуть в «man test», ну а если лениво или с английским плохо, читай дальше.
Ниже я перечислю ключи, которые можно использовать в тест-строке с их описанием и приведу примеры.

Проверка файлов:

Код: Выделить всё

-e      - файл существует
-f      - обычный файл
-d      - каталог
-h      - символическая ссылка
-L      - символическая ссылка
-r      - доступен для чтения
-w      - доступен для записи
-x      - исполняемый
-s      - не пуст
-N      - был модифицирован
-b      - блочное устройство
-c      - символьное устройство
-g      - установлен групповой идентификатор
-k      - имеет установленным «sticky» бит
-p      - именованный канал (pipe)
-S      - сокет
-u      - установлен бит пользователя
-O      - владелец имеет эффективный идентификатор пользователя
-G      - владелец имеет эффективный идентификатор группы
Пример:

Код: Выделить всё

if [ -e /etc/passwd ] ; then echo "Файл на месте" ; fi
Сравнении файлов:

Код: Выделить всё

-nt     - true, если файл слева имеет более позднюю дату модификации
-ot     - true, если наоборот
-ef     - проверка жесткой связи
Пример:

Код: Выделить всё

if [ /tmp/file1 -nt /tmp/file2 ] ; then echo "Файл /tmp/file1 новее" ; fi
Сравнение строк:

Код: Выделить всё

=       - true, если строки совпадают
!=      - true, если строки НЕ совпадают
<       - true, если при сортировке строка слева окажется раньше, чем строка справа
>       - true, если при сортировке строка справа окажется раньше, чем строка слева
-z      - true, если длина строки нулевая
-n      - true, если длина строки НЕ нулевая
Примеры:

Код: Выделить всё

if [ "$HOME" = "/home/angel" ] ; then echo "Мы дома" ; fi
if [ -z $PATH ] ; then echo 'Переменная $PATH не установлена!' ; fi
Сравнение целых чисел:

Код: Выделить всё

-eq     - равенство
-ne     - не равенство
-lt     - меньше
-le     - меньше или равно
-gt     - больше
-ge     - больше или равно
Пример:

Код: Выделить всё

ls /bbb ; if [ $? -ne 0 ] ; then echo "Нет такой папки" ; fi
Логические операции:

Код: Выделить всё

! expr          - истина, если выражение expr ложь (NOT)
expr1 -a expr2  - истина, если оба выражения expr1 и expr2 истина (AND)
expr1 -o expr2  - истина, если или expr1 или expr2 истина (OR)
Пример:

Код: Выделить всё

if [ ! -e /etc/passwd -o ! -s /etc/passwd ] ; then echo "Такого файла нет, либо он пустой" ; fi
ЗЫЖ Один товарищ меня спросил, нафига я этот пост в общем написал… Написал я его потому, что многие начинающие *nix'оиды не знают про эти возможности. Так надо же их просветить
Пошаговое исполнение /bin/sh скриптов
Очень часто для отладки скрипта нужно понять, что же именно сейчас делает bash в данный момент. Для этого открываем нужный нам скрипт:

Код: Выделить всё

e ~/SH/arp-ping.sh
и заменяем в самом начале:

Код: Выделить всё

#!/bin/sh на #!/bin/sh -vx
Ответить