test - выполнение тестов для файлов и текста
Синтаксис
test [EXPRESSION] [ [EXPRESSION] ]
Описание
Тестирует заданное выражение и устанавливает код выхода в 0, если оно истинно, и в 1, если ложно. Выражение состоит из одного или нескольких операторов и их аргументов.
Первый вариант (test) предпочтительнее. Для совместимости с другими оболочками доступен второй вариант: парные квадратные скобки ([ [EXPRESSION] ]).
Этот тест в основном совместим с POSIX.
При использовании переменной в качестве аргумента для оператора теста почти всегда следует заключать её в двойные кавычки. Существует всего две ситуации, когда можно безболезненно опустить кавычки. Первая — когда аргумент является литеральной строкой без пробелов или других символов, имеющих специальное значение для оболочки (например, точка с запятой). Например, test -b /my/file. Вторая — когда переменная раскрывается ровно в один элемент, включая пустую строку (например, set x ''). Если переменная не определена, определена, но не имеет значения или содержит более одного значения, её необходимо заключить в двойные кавычки. Например, test "$x" = "$y". Поскольку всегда безопасно заключать переменные в двойные кавычки при использовании их в качестве test аргументов, это рекомендуемая практика.
Операторы для файлов и каталогов
- -b ФАЙЛ
-
Возвращает true, если ФАЙЛ — это блочный устройство.
- -c ФАЙЛ
-
Возвращает true, если ФАЙЛ — это символьное устройство.
- -d ФАЙЛ
-
Возвращает true, если ФАЙЛ — это каталог.
- -e ФАЙЛ
-
Возвращает true, если ФАЙЛ существует.
- -f ФАЙЛ
-
Возвращает true, если ФАЙЛ — это обычный файл.
- -g ФАЙЛ
-
Возвращает true, если для ФАЙЛ установлен бит set-group-ID.
- -G ФАЙЛ
-
Возвращает true, если ФАЙЛ существует и имеет тот же идентификатор группы, что и текущий пользователь.
- -k ФАЙЛ
-
Возвращает true, если для ФАЙЛ установлен бит sticky. Если ОС не поддерживает эту концепцию, возвращает false. См. https://en.wikipedia.org/wiki/Sticky_bit.
- -L ФАЙЛ
-
Возвращает true, если ФАЙЛ — это символическая ссылка.
- -O ФАЙЛ
-
Возвращает true, если ФАЙЛ существует и принадлежит текущему пользователю.
- -p ФАЙЛ
-
Возвращает true, если ФАЙЛ — это именованная трубка.
- -r ФАЙЛ
-
Возвращает true, если ФАЙЛ помечен как читаемый.
- -s ФАЙЛ
-
Возвращает true, если размер ФАЙЛ больше нуля.
- -S ФАЙЛ
-
Возвращает true, если ФАЙЛ — это сокет.
- -t ДЕСКРИПТОР
-
Возвращает true, если дескриптор файла ДЕСКРИПТОР — это терминал (TTY).
- -u ФАЙЛ
-
Возвращает true, если для ФАЙЛ установлен бит set-user-ID.
- -w ФАЙЛ
-
Возвращает true, если ФАЙЛ помечен как записываемый; обратите внимание, что это не проверяет, является ли файловая система только для чтения.
- -x ФАЙЛ
-
Возвращает true, если ФАЙЛ помечен как исполняемый.
Операторы для сравнения файлов и каталогов
- ФАЙЛ1 -nt ФАЙЛ2
-
Возвращает true, если ФАЙЛ1 новее ФАЙЛ2 или ФАЙЛ1 существует, а ФАЙЛ2 нет.
- ФАЙЛ1 -ot ФАЙЛ2
-
Возвращает true, если ФАЙЛ1 старше ФАЙЛ2 или ФАЙЛ2 существует, а ФАЙЛ1 нет.
- ФАЙЛ1 -ef ФАЙЛ2
-
Возвращает true, если ФАЙЛ1 и ФАЙЛ2 ссылаются на один и тот же файл.
Операторы для текстовых строк
- СТРОКА1 = СТРОКА2
-
Возвращает true, если строки СТРОКА1 и СТРОКА2 идентичны.
- СТРОКА1 != СТРОКА2
-
Возвращает true, если строки СТРОКА1 и СТРОКА2 не идентичны.
- -n СТРОКА
-
Возвращает true, если длина СТРОКА ненулевая.
- -z СТРОКА
-
Возвращает true, если длина СТРОКА равна нулю.
Операторы для сравнения и проверки чисел
- ЧИСЛО1 -eq ЧИСЛО2
-
Возвращает true, если ЧИСЛО1 и ЧИСЛО2 численно равны.
- ЧИСЛО1 -ne ЧИСЛО2
-
Возвращает true, если ЧИСЛО1 и ЧИСЛО2 численно не равны.
- ЧИСЛО1 -gt ЧИСЛО2
-
Возвращает true, если ЧИСЛО1 больше ЧИСЛО2.
- ЧИСЛО1 -ge ЧИСЛО2
-
Возвращает true, если ЧИСЛО1 больше или равно ЧИСЛО2.
- ЧИСЛО1 -lt ЧИСЛО2
-
Возвращает true, если ЧИСЛО1 меньше ЧИСЛО2.
- ЧИСЛО1 -le ЧИСЛО2
-
Возвращает true, если ЧИСЛО1 меньше или равно ЧИСЛО2.
Поддерживаются целые и вещественные числа.
Операторы для объединения выражений
- УСЛОВИЕ1 -a УСЛОВИЕ2
-
Возвращает true, если оба УСЛОВИЕ1 и УСЛОВИЕ2 истинны.
- УСЛОВИЕ1 -o УСЛОВИЕ2
-
Возвращает true, если хотя бы УСЛОВИЕ1 или УСЛОВИЕ2 истинно.
Выражения можно инвертировать с помощью оператора !:
- ! ВЫРАЖЕНИЕ
-
Возвращает true, если ВЫРАЖЕНИЕ ложно, и false, если ВЫРАЖЕНИЕ истинно.
Выражения можно группировать с помощью скобок.
- ( ВЫРАЖЕНИЕ )
-
Возвращает значение ВЫРАЖЕНИЕ.
Обратите внимание, что скобки обычно требуют экранирования с помощью \( для предотвращения их интерпретации как подстановки команд.
Примеры
Если каталог /tmp существует, скопировать файл /etc/motd в него:
if test -d /tmp
cp /etc/motd /tmp/motd
end
Если переменная MANPATH определена и не пуста, вывести её содержимое. (Если MANPATH не определена, то она раскроется в ноль аргументов, если не заключена в кавычки.)
if test -n "$MANPATH"
echo $MANPATH
end
Скобки и операторы -o и -a могут быть объединены для создания более сложных выражений. В данном примере успех будет выведен, если существует файл /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.6/cmds/test.html