---
name: "test"
section: "1"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["linux", "freebsd", "openbsd"]
url: "https://new.carta.tech/test"
---

# test(1)

condition evaluation utility

## NAME

**test**, **\[** – condition evaluation utility

## SYNOPSIS

**test** *expression*

**\[**

*expression* **\]**

## DESCRIPTION

The **test** utility evaluates the *expression* and, if it evaluates to true, returns a zero (true) exit status; otherwise it returns 1 (false). If no *expression* is given, **test** also returns 1 (false). The form **\[** is an alias for **test**.

All operators and flags are separate arguments to the **test** utility. Symbolic links are followed for all primaries except **-h** and **-L**.

The following primaries are used to construct *expression*:

- **-b** *file*

  True if *file* exists and is a block special file.

- **-c** *file*

  True if *file* exists and is a character special file.

- **-d** *file*

  True if *file* exists and is a directory.

- **-e** *file*

  True if *file* exists (regardless of type).

- **-f** *file*

  True if *file* exists and is a regular file.

- **-G** *file*

  True if *file* exists and its group matches the effective group ID of this process.

- **-g** *file*

  True if *file* exists and its set-group-ID flag is set.

- **-h** *file*

  True if *file* exists and is a symbolic link. Identical to **-L**.

- **-k** *file*

  True if *file* exists and its sticky bit is set.

- **-L** *file*

  True if *file* exists and is a symbolic link. Identical to **-h**.

- **-n** *string*

  True if the length of *string* is nonzero.

- **-O** *file*

  True if *file* exists and its owner matches the effective user ID of this process.

- **-p** *file*

  True if *file* is a named pipe (FIFO).

- **-r** *file*

  True if *file* exists and is readable.

- **-S** *file*

  True if *file* exists and is a socket.

- **-s** *file*

  True if *file* exists and has a size greater than zero.

- **-t** *file\_descriptor*

  True if the file whose file descriptor number is *file\_descriptor* is open and is associated with a terminal.

- **-u** *file*

  True if *file* exists and its set-user-ID flag is set.

- **-w** *file*

  True if *file* exists and is writable. True indicates only that the write flag is on. The file is not writable on a read-only file system even if this test indicates true.

- **-x** *file*

  True if *file* exists and is executable. True indicates only that the execute flag is on. If *file* is a directory, true indicates that *file* can be searched.

- **-z** *string*

  True if the length of *string* is zero.

- *file1* **-nt** *file2*

  True if *file1* exists and is newer than *file2*.

- *file1* **-ot** *file2*

  True if *file1* exists and is older than *file2*.

- *file1* **-ef** *file2*

  True if *file1* and *file2* exist and refer to the same file.

- *s1* **=** *s2*

  True if the strings *s1* and *s2* are identical.

- *s1* **!=** *s2*

  True if the strings *s1* and *s2* are not identical.

- *s1* *s2*

  True if string *s1* comes before *s2* based on the ASCII value of their characters.

- *s1* *s2*

  True if string *s1* comes after *s2* based on the ASCII value of their characters.

- *s1*

  True if *s1* is not the null string.

- *n1* **-eq** *n2*

  True if the integers *n1* and *n2* are algebraically equal.

- *n1* **-ne** *n2*

  True if the integers *n1* and *n2* are not algebraically equal.

- *n1* **-gt** *n2*

  True if the integer *n1* is algebraically greater than the integer *n2*.

- *n1* **-ge** *n2*

  True if the integer *n1* is algebraically greater than or equal to the integer *n2*.

- *n1* **-lt** *n2*

  True if the integer *n1* is algebraically less than the integer *n2*.

- *n1* **-le** *n2*

  True if the integer *n1* is algebraically less than or equal to the integer *n2*.

These primaries can be combined with the following operators. The **-a** operator has higher precedence than the **-o** operator.

- **!** *expression*

  True if *expression* is false.

- *expression1* **-a** *expression2*

  True if both *expression1* and *expression2* are true.

- *expression1* **-o** *expression2*

  True if either *expression1* or *expression2* are true.

- **(** *expression* **)**

  True if *expression* is true.

## EXIT STATUS

The **test** utility exits with one of the following values:

- 0

  Expression evaluated to true.

- 1

  Expression evaluated to false or expression was missing.

- 1

  An error occurred.

## GRAMMAR AMBIGUITY

The **test** grammar is inherently ambiguous. In order to assure a degree of consistency, the cases described in IEEE Std 1003.2 (“POSIX.2”) section D11.2/4.62.4 are evaluated consistently according to the rules specified in the standards document. All other cases are subject to the ambiguity in the command semantics.

## SEE ALSO

[ksh(1)](/ksh/1.md)

## STANDARDS

The **test** utility is compliant with the IEEE Std 1003.1-2008 (“POSIX.1”) specification.

The primaries **-G**, **-k**, **-O**, **-nt**, **-ot**, **-ef**,, and are extensions to that specification.

The operators **-a**, **-o**, and **()** are marked by IEEE Std 1003.1-2008 (“POSIX.1”) as part of X/Open System Interfaces and obsolete.

**test** also exists as a built-in to [ksh(1)](/ksh/1.md), though with a different syntax.

## HISTORY

A **test** utility appeared in Version 7 AT&T UNIX.
