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отмечен как доступный для выполнения.
Операторы для текстовых строк
-
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истинны.
Выражения можно инвертировать с помощью оператора !:
-
! EXPRESSIONвозвращает true, еслиEXPRESSIONложно, и ложно, еслиEXPRESSIONистинно.
Выражения можно группировать с помощью круглых скобок.
-
( EXPRESSION )возвращает значениеEXPRESSION.
Обратите внимание, что круглые скобки обычно требуют экранирования с помощью \( , чтобы избежать их интерпретации как подстановки команд.
Примеры
Если каталог /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.
© 2021 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.3/cmds/test.html