TEST(1) | General Commands Manual | TEST(1) |
test
, [
—
test |
expression |
[ |
expression ] |
test
utility evaluates
expression and, if it evaluates to true, returns a zero
(true) exit status; otherwise it returns 1 (false). If
expression is not given, test
also returns 1 (false).
All operators and flags are separate arguments to the
test
utility.
The following primaries are used to construct expression:
-b
file-c
file-d
file-e
file-f
file-g
file-h
file-k
file-n
string-p
file-r
file-s
file-t
file_descriptor-u
file-w
file-x
file-z
string-L
file-h
instead.-O
file-G
file-S
file-nt
file2-ot
file2-ef
file2=
s2!=
s2<
s2>
s2-eq
n2-ne
n2-gt
n2-ge
n2-lt
n2-le
n2These primaries can be combined with the following operators:
!
expression-a
expression2-o
expression2(
expression )
The -a
operator has higher precedence than
the -o
operator.
Note that all file tests with the exception of
-h
and -L
follow symbolic
links and thus evaluate the test for the file pointed at.
test
utility exits with one of the following values:
test
utility implements a superset of the
IEEE Std 1003.2 (“POSIX.2”)
specification.
test
utility appeared in
Version 7 AT&T UNIX.
test
grammar is inherently ambiguous. In order to
assure a degree of consistency, the cases described in IEEE
Std 1003.2 (“POSIX.2”) section 4.62.4, are evaluated
consistently according to the rules specified in the standards document. All
other cases are subject to the ambiguity in the command semantics.
This means that test
should not be used
with more than 4 operands (where the terminating ]
in the case of the [
command does not count as an
operand,) and that the obsolete -a
and
-o
options should not be used. Instead invoke
test
multiple times connected by the
“&&” and “||” operators from
sh(1). When those operators are
not used, there is no need for the parentheses as grouping symbols, so those
should also be avoided. Using
sh(1)'s !
command instead of the equivalent operator from test
can also protect the script from future test enhancements.
Most expressions with 3 or less operands will evaluate as
expected, though be aware that with 3 operands, if the second is a known
binary operator, that is always evaluated, regardless of what the other
operands might suggest had been intended. If, and only if, the middle
operand is not a defined binary operator is the first operand examined to
see if it is !
in which case the remaining operands
are evaluated as a two operand test, and the result inverted. The only other
defined three operand case is the meaningless degenerate case where
parentheses (1st and 3rd operands) surround a one operand expression.
With 4 operands there are just two defined cases, the first where
the first operand is !
in which case the result of
the three operand test on the remaining operands is inverted, and the second
is similar to the 3 operand case, the degenerate case of parentheses
surrounding an (in this case) 2 operand test expression.
October 17, 2017 | NetBSD 9.4 |