test - выполнение тестов для файлов и текста
Краткое описание
test [EXPRESSION] [ [EXPRESSION] ]
Описание
Тестирует заданное выражение и устанавливает код возврата в 0, если оно истинно, и в 1, если ложно. Выражение состоит из одного или нескольких операторов и их аргументов.
Первый вариант (test) предпочтительнее. Для совместимости с другими оболочками доступен второй вариант: соответствующая пара квадратных скобок ([ [EXPRESSION] ]).
Данный тест в основном совместим с POSIX.
При использовании переменной в качестве аргумента оператора теста почти всегда следует заключать её в двойные кавычки. Есть только две ситуации, когда можно опустить кавычки. Первая — когда аргумент представляет собой строку без пробелов или других символов, имеющих специальное значение для оболочки (например, точка с запятой). Например, test -b /my/file. Вторая — когда переменная расширяется ровно до одного элемента, включая пустую строку (например, set x ''). Если переменная не задана, задана, но не имеет значения, или задана с несколькими значениями, её необходимо заключать в двойные кавычки. Например, test "$x" = "$y". Поскольку всегда безопасно заключать переменные в двойные кавычки, когда они используются в качестве test аргументов, это рекомендуется.
Операторы для файлов и каталогов
- -b FILE
-
Возвращает true, если FILE — это блочное устройство.
- -c FILE
-
Возвращает true, если FILE — это символьное устройство.
- -d FILE
-
Возвращает true, если FILE — это каталог.
- -e FILE
-
Возвращает true, если FILE существует.
- -f FILE
-
Возвращает true, если FILE — это обычный файл.
- -g FILE
-
Возвращает true, если для FILE установлен бит set-group-ID.
- -G FILE
-
Возвращает true, если FILE существует и имеет тот же идентификатор группы, что и текущий пользователь.
- -k FILE
-
Возвращает true, если для FILE установлен битый sticky. Если операционная система не поддерживает это понятие, возвращает false. См. https://en.wikipedia.org/wiki/Sticky_bit.
- -L FILE
-
Возвращает true, если FILE — это символическая ссылка.
- -O FILE
-
Возвращает true, если FILE существует и принадлежит текущему пользователю.
- -p FILE
-
Возвращает true, если FILE — это именованная труба.
- -r FILE
-
Возвращает true, если FILE помечен как читаемый.
- -s FILE
-
Возвращает true, если размер FILE больше нуля.
- -S FILE
-
Возвращает true, если FILE — это сокет.
- -t FD
-
Возвращает true, если дескриптор файла FD — это терминал (TTY).
- -u FILE
-
Возвращает true, если для FILE установлен бит set-user-ID.
- -w FILE
-
Возвращает true, если FILE помечен как записываемый; обратите внимание, что это не проверяет, является ли файловая система только для чтения.
- -x FILE
-
Возвращает true, если FILE помечен как исполняемый.
Операторы для сравнения файлов и каталогов
- FILE1 -nt FILE2
-
Возвращает true, если FILE1 новее, чем FILE2, или если FILE1 существует, а FILE2 — нет.
- FILE1 -ot FILE2
-
Возвращает true, если FILE1 старше, чем FILE2, или если FILE2 существует, а FILE1 — нет.
- FILE1 -ef FILE1
-
Возвращает true, если FILE1 и FILE2 ссылаются на один и тот же файл.
Операторы для текстовых строк
- STRING1 = STRING2
-
Возвращает true, если строки STRING1 и STRING2 идентичны.
- STRING1 != STRING2
-
Возвращает true, если строки STRING1 и STRING2 не идентичны.
- -n STRING
-
Возвращает true, если длина STRING не равна нулю.
- -z STRING
-
Возвращает true, если длина STRING равна нулю.
Операторы для сравнения и проверки чисел
- NUM1 -eq NUM2
-
Возвращает true, если NUM1 и NUM2 численно равны.
- NUM1 -ne NUM2
-
Возвращает true, если NUM1 и NUM2 численно не равны.
- NUM1 -gt NUM2
-
Возвращает true, если NUM1 больше, чем NUM2.
- NUM1 -ge NUM2
-
Возвращает true, если NUM1 больше или равно NUM2.
- NUM1 -lt NUM2
-
Возвращает true, если NUM1 меньше, чем NUM2.
- NUM1 -le NUM2
-
Возвращает true, если NUM1 меньше или равно NUM2.
Поддерживаются как целые, так и числа с плавающей точкой.
Операторы для объединения выражений
- COND1 -a COND2
-
Возвращает true, если оба COND1 и COND2 истинны.
- COND1 -o COND2
-
Возвращает true, если либо COND1, либо COND2 истинны.
Выражения можно инвертировать с помощью оператора !:
- ! ВЫРАЖЕНИЕ
-
Возвращает true, если ВЫРАЖЕНИЕ ложно, и ложно, если ВЫРАЖЕНИЕ истинно.
Выражения можно группировать с помощью скобок.
- ( ВЫРАЖЕНИЕ )
-
Возвращает значение ВЫРАЖЕНИЕ.
Обратите внимание, что скобки обычно требуют экранирования с помощью \( для предотвращения их интерпретации как подстановки команд.
Примеры
Если каталог /tmp существует, скопировать файл /etc/motd в него:
if test -d /tmp
cp /etc/motd /tmp/motd
end
Если переменная MANPATH определена и не пуста, вывести её содержимое. (Если MANPATH не определена, она расширится до нуля аргументов, если не заключена в кавычки.)
if test -n "$MANPATH"
echo $MANPATH
end
Скобки и операторы -o и -a могут комбинироваться для создания более сложных выражений. В этом примере, результат будет "true" если существует файл /foo или /bar , а также файл /baz или /bat.
if test \( -f /foo -o -f /bar \) -a \( -f /baz -o -f /bat \)
echo Success.
end
Числовые сравнения просто завершатся ошибкой, если один из операндов не является числом:
if test 42 -eq "The answer to life, the universe and everything"
echo So long and thanks for all the fish # will not be executed
end
Распространённым сравнением является сравнение с status:
if test $status -eq 0
echo "Previous command succeeded"
end
Предыдущий тест также может быть инвертирован:
if test ! $status -eq 0
echo "Previous command failed"
end
что логически эквивалентно следующему:
if test $status -ne 0
echo "Previous command failed"
end
Стандарты
test реализует подмножество стандарта IEEE Std 1003.1-2008 (POSIX.1). Следующие исключения применяются:
- Операторы
<и>для сравнения строк не реализованы. - Поскольку этот тест является встроенной функцией оболочки, а не отдельной утилитой, использование флага -c для специальных дескрипторов файлов, таких как стандартный ввод и вывод, может давать разные результаты при вызове изнутри канала, чем ожидается при вызове утилиты
testв другой оболочке.
В таких случаях можно использовать command test для явного использования системной отдельной утилиты test вместо этой встроенной функции builtin test.
© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.7/cmds/test.html