Файлы System/bin Android 12. Справочник.


  Все     Команда     Скрипт     Служба     Приложение  

test
Проверить типы файлов или сравнить значения

Симлинк на: [ ToyBox ]

Тип файла: команда
  Eng  

Используется в скриптах как 'test' или '[' (символ открывающей квадратной скобки)

[ ToyBox ]     [ ManLinux ]

Комментарии
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html

Утилита тестирования должна оценить выражение и указать результат оценки своим статусом выхода. Состояние выхода, равное нулю, указывает, что выражение оценивается как истинное, а состояние выхода, равное 1, указывает, что выражение оценивается как ложное.

Во второй форме утилиты, где используется имя утилиты [, а не test, приложение должно гарантировать, что закрывающая квадратная скобка является отдельным аргументом. Утилиты test и [ могут быть реализованы как одна связанная утилита, которая проверяет базовое имя нулевого аргумента командной строки, чтобы определить, следует ли вести себя как вариант test или [. Приложения, использующие семейство функций exec() для выполнения этих утилит, должны гарантировать, что аргумент, переданный в arg0 или argv[0], равен '[' при выполнении утилиты [ и имеет базовое имя "test" при выполнении тестовой утилиты.

ИСПОЛЬЗОВАНИЕ

Расширения XSI, определяющие двоичные первичные значения -a и -o и операторы '(' & ')',
были помечены как устаревшие.
Т.к. многие выражения, использующие их, неоднозначно определяются грамматикой
в зависимости от конкретных вычисляемых выражений.)
Сценарии, использующие эти выражения, должны быть преобразованы в формы,
указанные ниже.
Несмотря на то, что многие реализации будут продолжать поддерживать эти
устаревшие формы, скрипты должны быть чрезвычайно осторожны при работе
с пользовательским вводом, который можно спутать с этими и другими первичными
параметрами и операторами.
Если разработчик приложения не знает всех случаев, которые производят входные
данные для сценария, такие вызовы, как:

test "$1" -a "$2"

следует писать так:

test "$1" && test "$2"

чтобы избежать проблем, если пользователь ввел такие значения, как $1,
установленные в '!' и $2 устанавливается в нулевую строку.

То есть в тех случаях, когда важна максимальная переносимость, замените:

test expr1 -a expr2

на

test expr1 && test expr2

и замените:

test expr1 -o expr2

на

test expr1 || test expr2

но обратите внимание, что в тесте -a имеет более высокий приоритет,
чем -o, а "&&" и "||" имеют одинаковый приоритет в оболочке.

Скобки или фигурные скобки могут использоваться в командном языке
оболочки для группировки.

Скобки должны быть экранированы при использовании sh; например:

test \(выражение1 -a выражение2 \) -o выражение3

Эта команда не всегда переносима даже в XSI-совместимых системах в зависимости
от выражений, заданных expr1, expr2 и expr3.
Вместо этого можно использовать следующую форму:

( test expr1 && test expr2 ) || test expr3

Две команды:

test "$1"
test ! "1 доллар"

не может быть надежно использован в некоторых исторических системах.
Если бы такое строковое выражение использовалось, а $1 было бы расширено
до '!', '(' или известного унарного первичного признака,
могли бы возникнуть неожиданные результаты.

Лучшие конструкции:

test -n "$1"
test -z "$1"
соответственно.

Исторические системы также были ненадежными, учитывая общую конструкцию:

test "$response" = "ожидаемая строка"

Одна из следующих форм является более надежной:

test "X$response" = "Xожидаемая строка"
test "ожидаемая строка" = "$ ответ"

Обратите внимание, что вторая форма предполагает, что ожидаемую строку
нельзя спутать с какой-либо унарной первичной строкой.
Если ожидаемая строка начинается с '-', '(', '!' или даже '=',
вместо нее следует использовать первую форму.

Используя предыдущие правила без помеченных расширений XSI, любая из трех форм
сравнения является надежной, при любом вводе.
Однако обратите внимание, что строки во всех случаях заключаются в кавычки.

Поскольку бинарные первичные символы сравнения строк, '=' и "!=", имеют более
высокий приоритет, чем любой унарный первичный аргумент в случае более
4 аргументов, непредвиденные результаты могут возникнуть, если аргументы
не подготовлены должным образом.

Например, в:

test -d $1 -o -d $2

Если $1 оценивается как возможное имя каталога '=', первые три аргумента
считаются сравнением строк, что вызовет синтаксическую ошибку,
когда встретится второй -d.
Этому препятствует одна из следующих форм;

test \( -d "$1" \) -o \( -d "$2" \)
test -d "$1" || test -d "$2" (предпочтительнее)

Также в случае более 4 аргументов:

test "$1" = "летучая мышь" -a "$2" = "мяч"

синтаксические ошибки возникают, если $1 оценивается как '(' или '!'.
Одна из следующих форм предотвращает это; третья предпочтительнее:

test "X$1" = "Xbat" -a "X$2" = "Xball"
test "$1" = "летучая мышь" && test "$2" = "мяч"
test "X$1" = "Xbat" && test "X$2" = "Xball"

Обратите внимание, что ни один из следующих примеров не разрешен описанным синтаксисом:

[-f файл]
[-f файл]
[-f файл]
[-f файл
test -f файл]

В первых двух случаях, если утилита с именем [-f существует, будет вызываться
эта утилита, а не тест.
В остальных случаях скобки не совпадают, и поведение не указано. Однако:

test ! ]

имеет определенное значение и должен выйти со статусом 1. Аналогично:

test ]

должен выйти со статусом 0.

ПРИМЕРЫ

Выйти, если нет двух или трех аргументов (два варианта):

if [ $# -ne 2 ] && [ $# -ne 3 ]; then exit 1; fi
if [ $# -lt 2 ] || [ $# -gt 3 ]; then exit 1; fi

Выполните mkdir, если каталог не существует:

test ! -d tempdir && mkdir tempdir

Подождите, пока файл станет нечитаемым:

while test -r thefile
do
sleep 30
done
echo '"thefile" is no longer readable'

Выполните команду, если аргумент является одной из трех строк (два варианта)

if [ "$1" = "pear" ] || [ "$1" = "grape" ] || [ "$1" = "apple" ]
then
command fi

case "$1" in
pear|grape|apple) command ;;
esac