COHERENT manpages
This page displays the COHERENT manpage for test [Evaluate conditional expression].
List of available manpages
Index
test -- Command
Evaluate conditional expression
test expression ...
test evaluates an expression, which consists of string comparisons,
numerical comparisons, and tests of file attributes. For example, a test
command might be used within a shell script to test whether a certain file
exists and is readable.
The logical result (true or false) of the expression is returned by the
command for use by another shell construct, such as the command if.
Under the Korn shell, test is a built-in command that returns zero if
expression is true, and one if it is false. Under the Bourne shell, test
is not a built-in command; rather, the Bourne shell uses the command
/bin/test to test expressions. /bin/sh returns zero if the expression is
true, one if it is false, and two if a syntax error (or other error)
occurred.
Expression Options
test recognizes the following options, one or more of which can be built
into an expression:
! exp Negates the logical value of expression exp.
string1 != string2
string1 is not equal to string2.
string1 < string2
string1 is lexicographically less than string2 (sh only).
string1 = string2
string1 is equal to string2.
string1 > string2
string1 is lexicographically greater than string2 (sh only).
(exp) Parentheses allow expression grouping.
exp1 -a exp2
Both expressions exp1 and exp2 are true.
-b file file is a block-special device.
-c file file is a character-special file.
-d file file exists and is a directory.
-e file file exists (/bin/test only).
file1 -ef file2
file1 is the same file as file2.
n1 -eq n2 Numbers n1 and n2 are equal. Please note that test evalutes
the expression as zero. Thus, if one of the arguments is a
variable that is not set, test treats it as if it were zero.
For example, consider the expression:
if [ "$notset" -eq 0 ]
If notset is not set, test evaluates it to zero and so returns
true.
-f file file exists and is an ordinary file.
-g file File mode has setgid bit.
n1 -ge n2 Number n1 is greater than or equal to n2.
n1 -gt n2 Number n1 is greater than n2.
-k file File mode has sticky bit.
-L file File is a symbolic link.
n1 -le n2 Number n1 is less than or equal to n2.
n1 -lt n2 Number n1 is less than n2.
-n string string has nonzero length.
n1 -ne n2 Numbers n1 and n2 are not equal.
file1 -nt file2
file1 is newer than file2.
exp1 -o exp2
Either expression exp1 or exp2 is true. -a has greater
precedence than -o.
file1 -ot file2
file1 is older than file2.
-p file file is a named pipe.
-r file file exists and is readable.
-s file file exists and has nonzero size.
-t [fd] fd is the file descriptor number of a file that is open and a
terminal. The Bourne shell requires that fd be given; under
the Korn shell, however, defaults to the standard output (file
descriptor 1) if no fd is given.
-u file File mode has setuid set.
-w file file exists and is writable.
-x file file exists and executable.
-z string string has zero length (is a null string).
string string has nonzero length.
Implementations of test
The implementation of test under the Bourne shell has been rewritten for
COHERENT release 4.2, both to extend its range of features and to make it
more compliant with published standards. Although this makes test more
useful to programmers, it may create problems when you try to execute a
Bourne-shell script written under COHERENT release 4.2 on an earlier
release of COHERENT. The following describes how the Bourne shell's
implementation of test was designed; and how it differs both from earlier
implementations under the Bourne shell and from the implementation under
the Korn shell.
To begin, the Bourne shell's implementation of test attempts to comply with
the POSIX Standard, comply with previous COHERENT releases of test, and
comply with System-V UNIX to the greatest extent possible. However, these
objectives are mutually exclusive. See the POSIX Standard P1003.2/D11.2
§4.62, especially the Rationale, for details of some of the problems.
In particular, System V and Berkeley differ in the way they parse some
expressions, which leads the POSIX Standard to specify test behavior for a
minimal set of expressions, not including -a and -o.
The following details differences among the various implementations of
test. First, the following options were not implemented in the Bourne
shell's implementation of test prior to COHERENT release 4.2, but were
included in the Korn shell's implementation: -b, -c, -ef, -g, -k, -L, -nt,
-ot, -p, -u, and -x. Of these, the following are not described in the POSIX
Standard: -k, -L, -ef, -nt, and -ot. Note that Bourne-shell scripts that
use any of the above options to test will not run on versions of COHERENT
prior to release 4.2, but will run under the Korn shell.
Next, the Bourne shell for COHERENT 4.2 implements the POSIX Standard's
option -e and the options < and >. Bourne-shell scripts that use any
of these three options to test will not run on versions of COHERENT prior
to release 4.2, nor will they run under the Korn shell.
The definitions of the options -f and -t have been changed from the
Berkeley standard to that described in the POSIX Standard. Berkeley
defines -f as meaning that a file exists and is not a directory; whereas
the POSIX Standard defines it as meaning that a file exists and is a
regular file. Versions of the Bourne shell prior to COHERENT 4.2 use the
Berkeley definitions; whereas all version of the Korn shell and Bourne
shell under COHERENT 4.2 use the POSIX Standard's definition. Berkeley
gives -t a default value of one if it is not used with an argument; whereas
the POSIX Standard requires that -t have an argument. The Korn shell and
all versions of the Bourne shell prior to COHERENT 4.2 use the Berkeley
definition; whereas the Bourne shell under COHERENT 4.2 uses the POSIX
Standard's definition. These differences are subtle, but important. Thus,
a Bourne shell script that uses either of these options may not run
correctly when imported into COHERENT 4.2 from earlier versions of
COHERENT, or when exported from COHERENT 4.2 to them or to the Korn shell.
Finally, test under the Korn shell and under the Bourne shell prior to
COHERENT 4.2 returns zero if an expression is true and one either if the
expression is false or if the expression contained a syntax error.
However, test under the Bourne shell for COHERENT 4.2 returns zero if an
expression is true, one if it is false, and two if a syntax error occurred.
Bourne-shell scripts that pay close attention to what test returns may not
run correctly when imported into COHERENT 4.2 from earlier implementations
of COHERENT, or when exported from COHERENT 4.2 to earlier versions of
COHERENT or to the Korn shell.
Example
The following example uses the test command to determine whether a file is
writable.
if test ! -w /dev/lp
then
echo The line printer is inaccessible.
fi
Under COHERENT, the command `[' is linked to test. If invoked as `[', test
checks that its last argument is `]'. This allows an alternative syntax:
simply enclose expression in square brackets. For example, the above
example can be written as follows:
if [ ! -w /dev/lp ]
then
echo The line printer is inaccessible.
fi
For a more extended example of the square-bracket syntax, see sh.
See Also
commands,
expr,
find,
if,
ksh,
sh,
while
Notes
The Korn shell's version of this command is based on the public-domain
version written by Erik Baalbergen and Arnold Robbins.











