TEST(1) General Commands Manual TEST(1)

# [NAME](#NAME)

test - Check file types and compare values.

# [SYNOPSIS](#SYNOPSIS)

**test** EXPRESSION  
**test**  
\[ EXPRESSION ]  
\[ ]  
[ OPTION

# [DESCRIPTION](#DESCRIPTION)

Check file types and compare values.

# [OPTIONS](#OPTIONS)

[**-h**, **--help**](#h)

Print help

[**-V**, **--version**](#V)

Print version

# [EXTRA](#EXTRA)

Exit with the status determined by EXPRESSION.

An omitted EXPRESSION defaults to false. Otherwise, EXPRESSION is true or false and sets exit status. It is one of:

( EXPRESSION )  
EXPRESSION is true

! EXPRESSION  
EXPRESSION is false

EXPRESSION1 -a EXPRESSION2  
both EXPRESSION1 and EXPRESSION2 are true

EXPRESSION1 -o EXPRESSION2  
either EXPRESSION1 or EXPRESSION2 is true

String operations:

-n STRING  
the length of STRING is nonzero

STRING  
equivalent to -n STRING

-z STRING  
the length of STRING is zero

STRING1 = STRING2  
the strings are equal

STRING1 != STRING2  
the strings are not equal

STRING1 &gt; STRING2  
STRING1 is greater than STRING2 in the current locale

STRING1 &lt; STRING2  
STRING1 is less than STRING2 in the current locale

Integer comparisons:

INTEGER1 -eq INTEGER2  
INTEGER1 is equal to INTEGER2

INTEGER1 -ge INTEGER2  
INTEGER1 is greater than or equal to INTEGER2

INTEGER1 -gt INTEGER2  
INTEGER1 is greater than INTEGER2

INTEGER1 -le INTEGER2  
INTEGER1 is less than or equal to INTEGER2

INTEGER1 -lt INTEGER2  
INTEGER1 is less than INTEGER2

INTEGER1 -ne INTEGER2  
INTEGER1 is not equal to INTEGER2

File operations:

FILE1 -ef FILE2  
FILE1 and FILE2 have the same device and inode numbers

FILE1 -nt FILE2  
FILE1 is newer (modification date) than FILE2

FILE1 -ot FILE2  
FILE1 is older than FILE2

-b FILE  
FILE exists and is block special

-c FILE  
FILE exists and is character special

-d FILE  
FILE exists and is a directory

-e FILE  
FILE exists

-f FILE  
FILE exists and is a regular file

-g FILE  
FILE exists and is set-group-ID

-G FILE  
FILE exists and is owned by the effective group ID

-h FILE  
FILE exists and is a symbolic link (same as -L)

-k FILE  
FILE exists and has its sticky bit set

-L FILE  
FILE exists and is a symbolic link (same as -h)

-N FILE  
FILE exists and has been modified since it was last read

-O FILE  
FILE exists and is owned by the effective user ID

-p FILE  
FILE exists and is a named pipe

-r FILE  
FILE exists and read permission is granted

-s FILE  
FILE exists and has a size greater than zero

-S FILE  
FILE exists and is a socket

-t FD  
file descriptor FD is opened on a terminal

-u FILE  
FILE exists and its set-user-ID bit is set

-w FILE  
FILE exists and write permission is granted

-x FILE  
FILE exists and execute (or search) permission is granted

Except for -h and -L, all FILE-related tests dereference (follow) symbolic links. Beware that parentheses need to be escaped (e.g., by backslashes) for shells. INTEGER may also be -l STRING, which evaluates to the length of STRING.

NOTE: Binary -a and -o are inherently ambiguous. Use test EXPR1 && test EXPR2 or test EXPR1 || test EXPR2 instead.

NOTE: [ honors the --help and --version options, but test does not. test treats each of those as it treats any other nonempty STRING.

NOTE: your shell may have its own version of test and/or [, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.

Errors are reported with the expression echoed back and a caret under the argument at fault whenever stderr is a terminal; anything else reading stderr gets the usual single-line message.

# [VERSION](#VERSION)

v(uutils coreutils) 0.12.0

2026-09-30

---

Document: test(1) from uutils 0.12.0-r1 (Chainguard OS)
Source: https://github.com/uutils/coreutils
