TEST(1) User Commands TEST(1)

# [NAME](#NAME)

test - check file types and compare values

# [SYNOPSIS](#SYNOPSIS)

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

# [DESCRIPTION](#DESCRIPTION)

Exit with the status determined by EXPRESSION.

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

display this help and exit

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

output version information and exit

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](#EXPRESSION1)

both EXPRESSION1 and EXPRESSION2 are true

[EXPRESSION1 **-o** EXPRESSION2](#EXPRESSION1~2)

either EXPRESSION1 or EXPRESSION2 is true

[**-n STRING**](#n)

the length of STRING is nonzero

[STRING](#STRING)

equivalent to **-n** STRING

[**-z STRING**](#z)

the length of STRING is zero

[STRING1 = STRING2](#STRING1)

the strings are equal

[STRING1 != STRING2](#STRING1~2)

the strings are not equal

[STRING1 &gt; STRING2](#STRING1~3)

STRING1 is greater than STRING2 in the current locale

[STRING1 &lt; STRING2](#STRING1~4)

STRING1 is less than STRING2 in the current locale

[**INTEGER1 -eq INTEGER2**](#INTEGER1)

INTEGER1 is equal to INTEGER2

[**INTEGER1 -ge INTEGER2**](#INTEGER1~2)

INTEGER1 is greater than or equal to INTEGER2

[**INTEGER1 -gt INTEGER2**](#INTEGER1~3)

INTEGER1 is greater than INTEGER2

[**INTEGER1 -le INTEGER2**](#INTEGER1~4)

INTEGER1 is less than or equal to INTEGER2

[**INTEGER1 -lt INTEGER2**](#INTEGER1~5)

INTEGER1 is less than INTEGER2

[**INTEGER1 -ne INTEGER2**](#INTEGER1~6)

INTEGER1 is not equal to INTEGER2

[**FILE1 -ef FILE2**](#FILE1)

FILE1 and FILE2 have the same device and inode numbers

[**FILE1 -nt FILE2**](#FILE1~2)

FILE1 is newer (modification date) than FILE2

[**FILE1 -ot FILE2**](#FILE1~3)

FILE1 is older than FILE2

[**-b FILE**](#b)

FILE exists and is block special

[**-c FILE**](#c)

FILE exists and is character special

[**-d FILE**](#d)

FILE exists and is a directory

[**-e FILE**](#e)

FILE exists

[**-f FILE**](#f)

FILE exists and is a regular file

[**-g FILE**](#g)

FILE exists and its set-group-ID bit is set

[**-G FILE**](#G)

FILE exists and is owned by the effective group ID

[**-h FILE**](#h)

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

[**-k FILE**](#k)

FILE exists and has its sticky bit set

[**-L FILE**](#L)

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

[**-N FILE**](#N)

FILE exists and has been modified since it was last read

[**-O FILE**](#O)

FILE exists and is owned by the effective user ID

[**-p FILE**](#p)

FILE exists and is a named pipe

[**-r FILE**](#r)

FILE exists and the user has read access

[**-s FILE**](#s)

FILE exists and has a size greater than zero

[**-S FILE**](#S)

FILE exists and is a socket

[**-t FD**](#t)

file descriptor FD is opened on a terminal

[**-u FILE**](#u)

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

[**-w FILE**](#w)

FILE exists and the user has write access

[**-x FILE**](#x)

FILE exists and the user has execute (or search) access

Except for **-h** and **-L**, all FILE-related tests dereference 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.

Binary **-a** and **-o** are ambiguous. Use 'test EXPR1 && test EXPR2' or 'test EXPR1 || test EXPR2' instead.

'[' honors **--help** and **--version**, but 'test' treats them as STRINGs.

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.

# [AUTHOR](#AUTHOR)

Written by Kevin Braunsdorf and Matthew Bradburn.

# [REPORTING BUGS](#REPORTING_BUGS)

Report bugs to: &lt;bug-coreutils@gnu.org&gt;.  
Report any translation bugs to: &lt;https://translationproject.org/team/&gt;.  
GNU coreutils home page: &lt;https://www.gnu.org/software/coreutils/&gt;  
General help using GNU software: &lt;https://www.gnu.org/gethelp/&gt;

# [COPYRIGHT](#COPYRIGHT)

Copyright © 2026 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later &lt;https://gnu.org/licenses/gpl.html&gt;.  
This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

# [SEE ALSO](#SEE_ALSO)

[**access**(2)](/man/os/coreutils/access.2)

Full documentation &lt;https://www.gnu.org/software/coreutils/test&gt;  
or available locally via: info '(coreutils) test invocation'

October 2026 GNU coreutils 9.12

---

Document: test(1) from coreutils 9.12-r6 (Chainguard OS)
Source: https://git.savannah.gnu.org/git/coreutils.git
