my-server
← Wiki

Test (Unix)

test is a command-line utility found in Unix, Plan 9, and Unix-like operating systems that evaluates conditional expressions. test was turned into a shell builtin command in 1981 with UNIX System III and at the same time made available under the alternate name [.

Overview

The <code>test</code> command in Unix evaluates the <code>expression</code> parameter. In most recent shell implementations, it is a shell builtin, even though the external version still exists. In the second form of the command, the <code>[ ]</code> (brackets) must be surrounded by blank spaces (this is because <code>[</code> is a program and POSIX compatible shells require a space between the program name and its arguments). One must test explicitly for file names in the C shell. File-name substitution (globbing) causes the shell script to exit.

The <code>test</code> command is not to be confused with the <code>[[</code> reserved word that was introduced with ksh88. The latter is not a command but part of the ksh88 syntax and does not apply file-name substitution to glob expressions.

The version of <code>test</code> bundled in GNU coreutils was written by Kevin Braunsdorf and Matthew Bradburn. The command is available as a separate package for Microsoft Windows as part of the UnxUtils collection of native Win32 ports of common GNU Unix-like utilities. The command has also been ported to the IBM i operating system.

Syntax

<code>test expression</code> or <code>[ expression ]</code>

Arguments

The following arguments are used to construct this parameter. All arguments return <code>True</code> if the object (file or string) exists, and the condition specified is true.

For the <code>-x</code> argument, if the specified file exists and is a directory, the <code>True</code> exit value indicates that the current process has permission to change <code>cd</code> into the directory.

Non standard Korn Shell extensions

file1 -nt file2 - file1 is newer than file2 file1 -ot file2 - file1 is older than file2 file1 -ef file2 - file1 is another name for file2 - (symbolic link or hard link)

String arguments

In Perl, these sections are reversed: <code>eq</code> is a string operator and <code>==</code> is a numerical operator, and so on for the others.

-n String1 - the length of the String1 variable is nonzero -z String1 - the length of the String1 variable is 0 (zero) String1 = String2 - String1 and String2 variables are identical String1 != String2 - String1 and String2 variables are not identical String1 - true if String1 variable is not a null string

Number arguments

Integer1 -eq Integer2 - Integer1 and Integer2 variables are algebraically equal -ne - not equal -gt - greater than -ge - greater or equal -lt - less than -le - less or equal

Operators

<code>test</code> arguments can be combined with the following operators: ! - Unary negation operator -a - Binary AND operator -o - Binary OR operator (the <code>-a</code> operator has higher precedence than the <code>-o</code> operator) \(Expression\) - Parentheses for grouping must be escaped with a backslash <code>\</code>

The <code>-a</code> and <code>-o</code> operators, along with parentheses for grouping, are XSI extensions and are therefore not portable. In portable shell scripts, the same effect may be achieved by connecting multiple invocations of <code>test</code> together with the <code>&&</code> and <code>||</code> operators and parentheses.

Exit status

This command returns the following exit values:

0 - The Expression parameter is true 1 - The Expression parameter is false or missing >1 - An error occurred

Examples

1. To test whether a file is nonexistent or empty, type:

If the file specified by the first positional parameter to the shell procedure, $1, does not exist or is of size 0, the test command displays the message. If $1 exists and has a size greater than 0, the test command displays nothing.

Note: There must be a space between the -s function and the file name.

The quotation marks around $1 ensure that the test works properly even if the value of $1 is a null string. If the quotation marks are omitted and $1 is the empty string, the test command displays the error message:

test: argument expected.

2. To do a complex comparison, type:

If the shell procedure is given fewer than two positional parameters or the file specified by $1 does not exist, then the shell procedure exits. The special shell variable $# represents the number of positional parameters entered on the command line that starts this shell procedure.

See also

References

Further reading

  • (free download)

External links