Wiki

Команда test ("[ ]")

Команда test проверяет выполнение некоторого условия. С использованием этой (встроенной) команды формируются операторы выбора и цикла языка shell.

Два возможных формата команды:

     test условие

или
     [ условие ]

мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово "test", будем заключать условие
в скобки, что более привычно для программистов.

На самом деле shell будет распознавать эту команду по открывающей скобке "[", как слову(!), соответсвующему команде "test". Уже этого достаточно, чтобы предупредить о распространенной ошибке начинающих: Между скобками и содержащимся в них условием обязательно должны быть пробелы.

Пробелы должны быть и между значениями и символом сравнения или операции (как, кстати, и в команде "expr"). Не путать с противоположным требованием для присваивания значений переменным.

В shell используются условия различных "типов".
УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ:

     -f file - файл "file" является обычным файлом;
     -d file - файл "file" - каталог;
     -с file - файл "file" - специальный файл;
     -r file - имеется разрешение на чтение файла "file";
     -w file - имеется разрешение на запись в файл "file";
     -s file - файл "file" не пустой.

Примеры. Вводя с клавиатуры командные строки в первом случае получим подтверждение (код завершения "0"), а во втором - опровержение (код завершения "1"). "specific" - имя существующего файла.
     [ -f specific ] ; echo $?
     0
 
     [ -d specific ] ; echo $?
     1

УСЛОВИЯ ПРОВЕРКИ СТРОК:
     str1 = str2  - строки "str1" и "str2" совпадают;
     str1 != str2  - строки "str1" и "str2" не совпадают;
     -n str1  - строка "str1" существует (непустая);
     -z str1  строка "str1" не существует (пустая).

Примеры.
     x="who is who"; export x; [ "who is who" = "$x" ]; echo $?
     0
 
     x=abc ; export x ; [ abc = "$x" ] ; echo $?
     0
 
     x=abc ; export x ; [ -n "$x" ] ; echo $?
     0
 
     x="" ; export x ; [ -n "$x" ] ; echo $?
     1

ВАЖНОЕ ЗАМЕЧАНИЕ. Команда "test" дает значение "истина" (т.е. код завершения "0") и просто если в скобках стоит непустое слово.
      [ privet ] ; echo $?
      0
 
      [ ] ; echo $?
      1

Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки).
      true ; echo $?
      0
 
      false ; echo $?
      1

УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ:
     x -eq y   - "x" равно "y",
     x -ne y   - "x" неравно "y",
     x -gt y   - "x" больше "y",
     x -ge y   - "x" больше или равно "y",
     x -lt y   - "x" меньше "y",
     x -le y   - "x" меньше или равно "y".

То есть в данном случае команда "test" воспринимает строки символов как целые (!) числа. Поэтому во всех остальных случаях "нулевому" значению соответствует пустая строка. В данном же случае, если надо обнулить переменную, скажем, "x", то это достигается присваиванием "x=0".
Примеры.
     x=abc ; export x ; [ abc -eq "$x" ] ; echo $?
     "[": integer expression expected before -eq
 
     x=321 ; export x ; [ 321 -eq "$x" ] ; echo $?
     0
 
     x=3.21 ; export x ; [ 3.21 -eq "$x" ] ; echo $?
     "[": integer expression expected before -eq
 
     x=321 ; export x ; [ 123 -lt "$x" ] ; echo $?
     0

СЛОЖНЫЕ УСЛОВИЯ:
Реализуются с помощью типовых логических операций:
     !   -  (not)  инвертирует значение кода завершения.
     -o  -  (or) соответсвует логическому "ИЛИ".
     -a  -  (and) соответсвует логическому "И".

ПРЕДУПРЕЖДЕНИЕ. Не забывайте о пробелах.

Примеры.

      [ ! privet ] ; echo $?
      1
 
     x=privet; export x; [ "$x" -a -f specific ] ; echo $?
     0
 
     x="";export x; [ "$x" -a -f specific ] ; echo $?
     1
 
     x="";export x; [ "$x" -a -f specific -o privet ] ; echo $?
     0
 
     x="";export x; [ "$x" -a -f specific -o ! privet ] ; echo $?
     1

СОВЕТ. Не злоупотреблять сложными условиями.