LinuxCommandLibrary

test

Evaluate conditional expressions

TLDR

Check if a file exists

$ test -e [path/to/file] && echo "exists"
copy
Check if file is a directory
$ test -d [path/to/dir] && echo "is directory"
copy
Check if file is readable
$ test -r [path/to/file] && echo "readable"
copy
Compare strings for equality
$ test "[string1]" = "[string2]"
copy
Check if string is non-empty
$ test -n "[string]"
copy
Compare integers
$ test [5] -gt [3] && echo "greater"
copy
Combine conditions with AND
$ test -f [file] -a -r [file]
copy
Combine conditions with OR
$ test -f [file1] -o -f [file2]
copy

SYNOPSIS

test EXPRESSION
[ EXPRESSION ]

DESCRIPTION

test evaluates conditional expressions, returning exit status 0 (true) or 1 (false). It is commonly used in shell scripts for decision-making in if statements and loops.
The command can also be invoked as [ with a closing ] required as the last argument. This bracket syntax is more readable in conditionals: if [ -f file ]; then.
Modern shells also provide [[ which offers additional features like pattern matching and safer string handling, but is not POSIX-compliant.

FILE TESTS

-e FILE

True if file exists.
-f FILE
True if file exists and is a regular file.
-d FILE
True if file exists and is a directory.
-r FILE
True if file is readable.
-w FILE
True if file is writable.
-x FILE
True if file is executable.
-s FILE
True if file exists and has size greater than zero.
-L FILE
True if file is a symbolic link.

STRING TESTS

-n STRING

True if string length is non-zero.
-z STRING
True if string length is zero.
STRING1 = STRING2
True if strings are equal.
STRING1 != STRING2
True if strings are not equal.

INTEGER COMPARISONS

INT1 -eq INT2

Equal.
INT1 -ne INT2
Not equal.
INT1 -lt INT2
Less than.
INT1 -le INT2
Less than or equal.
INT1 -gt INT2
Greater than.
INT1 -ge INT2
Greater than or equal.

OPERATORS

! EXPR

True if expression is false.
EXPR1 -a EXPR2
True if both expressions are true (AND).
EXPR1 -o EXPR2
True if either expression is true (OR).

CAVEATS

Variables in test expressions should be quoted to handle empty values and spaces correctly. The [ form requires spaces around brackets. String comparison uses = not == for POSIX compliance. Integer comparison operators (-eq, -lt) are different from string operators.

HISTORY

test is one of the original Unix utilities, dating back to Version 7 Unix in 1979. The bracket notation [ was added as an alias for improved readability in shell scripts. Both forms are specified by POSIX and available as shell builtins and standalone commands.

SEE ALSO

bash(1), sh(1), expr(1)

> TERMINAL_GEAR

Curated for the Linux community

Copied to clipboard

> TERMINAL_GEAR

Curated for the Linux community