Spec-Zone.ru › Fish 3.4

test - проверка файлов и текста

Описание

test [EXPRESSION]
[ [EXPRESSION] ]

Описание

Проверяет заданное выражение и устанавливает код завершения в 0, если оно истинно, и в 1, если ложно. Выражение состоит из одного или нескольких операторов и их аргументов.

Первый вариант (test) предпочтительнее. Для совместимости с другими оболочками доступен второй вариант: соответствующая пара квадратных скобок ([ [EXPRESSION] ]).

Данная проверка в основном совместима с POSIX.

При использовании переменной в качестве аргумента оператора проверки практически всегда следует заключать её в двойные кавычки. Существует только две ситуации, когда можно опустить кавычки. Первая — когда аргумент представляет собой строку без пробелов или других символов, особых для оболочки (например, точка с запятой). Например, test -b /my/file. Вторая — использование переменной, которая раскрывается ровно в один элемент, включая пустую строку (например, set x ''). Если переменная не задана, задана, но без значения или задана более чем с одним значением, её необходимо заключать в двойные кавычки. Например, test "$x" = "$y". Так как всегда безопасно заключать переменные в двойные кавычки, когда они используются в качестве test аргументов, рекомендуется именно такой подход.

Операторы для файлов и каталогов

-b FILE

Возвращает истинное значение, если FILE является блочным устройством.

-c FILE

Возвращает истинное значение, если FILE является символьным устройством.

-d FILE

Возвращает истинное значение, если FILE является каталогом.

-e FILE

Возвращает истинное значение, если FILE существует.

-f FILE

Возвращает истинное значение, если FILE является обычным файлом.

-g FILE

Возвращает истинное значение, если для FILE установлен бит set-group-ID.

-G FILE

Возвращает истинное значение, если FILE существует и имеет тот же идентификатор группы, что и текущий пользователь.

-k FILE

Возвращает истинное значение, если для FILE установлен бит sticky. Если операционная система не поддерживает эту концепцию, возвращается ложное значение. См. https://en.wikipedia.org/wiki/Sticky_bit.

-L FILE

Возвращает истинное значение, если FILE является символической ссылкой.

-O FILE

Возвращает истинное значение, если FILE существует и принадлежит текущему пользователю.

-p FILE

Возвращает истинное значение, если FILE является именованной очередью.

-r FILE

Возвращает истинное значение, если FILE отмечен как доступный для чтения.

-s FILE

Возвращает истинное значение, если размер FILE больше нуля.

-S FILE

Возвращает истинное значение, если FILE является сокетом.

-t FD

Возвращает истинное значение, если дескриптор файла FD является терминалом (TTY).

-u FILE

Возвращает истинное значение, если для FILE установлен бит set-user-ID.

-w FILE

Возвращает истинное значение, если FILE отмечен как доступный для записи; обратите внимание, что это не проверяет, является ли файловая система только для чтения.

-x FILE

Возвращает истинное значение, если FILE отмечен как исполняемый.

Операторы для текстовых строк

STRING1 = STRING2

Возвращает истинное значение, если строки STRING1 и STRING2 идентичны.

STRING1 != STRING2

Возвращает истинное значение, если строки STRING1 и STRING2 не идентичны.

-n STRING

Возвращает истинное значение, если длина STRING отлична от нуля.

-z STRING

Возвращает истинное значение, если длина STRING равна нулю.

Операторы для сравнения и проверки чисел

NUM1 -eq NUM2

Возвращает истинное значение, если NUM1 и NUM2 численно равны.

NUM1 -ne NUM2

Возвращает истинное значение, если NUM1 и NUM2 численно не равны.

NUM1 -gt NUM2

Возвращает истинное значение, если NUM1 больше NUM2.

NUM1 -ge NUM2

Возвращает истинное значение, если NUM1 больше или равно NUM2.

NUM1 -lt NUM2

Возвращает истинное значение, если NUM1 меньше NUM2.

NUM1 -le NUM2

Возвращает истинное значение, если NUM1 меньше или равно NUM2.

Поддерживаются целые и числа с плавающей точкой.

Операторы для объединения выражений

COND1 -a COND2

Возвращает истинное значение, если оба COND1 и COND2 истинны.

COND1 -o COND2

Возвращает истинное значение, если либо COND1, либо COND2 истинны.

Выражения можно инвертировать с помощью оператора !:

! EXPRESSION

Возвращает истинное значение, если 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.

© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.4/cmds/test.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API