Spec-Zone.ru › Fish 3.3

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

Spec-Zone.ru

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