# man > TEST(1)

> **TLDR:** Check file types and compare values.
>
- Test if a given variable is equal to a given string:
  `test "{{$MY_VAR}}" = "{{/bin/zsh}}"`
- Test if a given variable is empty ([z]ero length):
  `test -z "{{$GIT_BRANCH}}"`
- Test if a [f]ile exists:
  `test -f "{{path/to/file}}"`
- Test if a [d]irectory does not exist:
  `test ! -d "{{path/to/directory}}"`
- If A is true, then do B, or C in the case of an error (notice that C may run even if A fails):
  `test {{condition}} && {{echo "true"}} || {{echo "false"}}`
- Use `test` in a conditional statement:
  `if test -f "{{path/to/file}}"; then echo "File exists"; else echo "File does not exist"; fi`

*Source: tldr-pages*

---

[_TEST_(1)](https://www.chedong.com/phpMan.php/man/TEST/1/markdown)                                     User Commands                                    [_TEST_(1)](https://www.chedong.com/phpMan.php/man/TEST/1/markdown)

## NAME
       test - check file types and compare values

## SYNOPSIS
       **test _**EXPRESSION_
### test
       **[ _**EXPRESSION_ **]**
### [ ]
       **[ _**OPTION_

## DESCRIPTION
       Exit with the status determined by EXPRESSION.

       **--help **display this help and exit

### --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
              both EXPRESSION1 and EXPRESSION2 are true

       EXPRESSION1 **-o **EXPRESSION2
              either EXPRESSION1 or EXPRESSION2 is true

### -n 
              the length of STRING is nonzero

       STRING equivalent to **-n **STRING

### -z 
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
              the strings are not equal

       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

       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 exists and is block special

### -c 
              FILE exists and is character special

### -d 
              FILE exists and is a directory

### -e 
              FILE exists

### -f 
              FILE exists and is a regular file

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

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

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

### -k 
              FILE exists and has its sticky bit set

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

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

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

### -p 
              FILE exists and is a named pipe

### -r 
              FILE exists and the user has read access

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

### -S 
              FILE exists and is a socket

### -t 

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

### -w 
              FILE exists and the user has write access

### -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  paren‐
       theses  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 ver‐
       sion described here.  Please refer to your shell's documentation for details  about  the  op‐
       tions it supports.

## AUTHOR
       Written by Kevin Braunsdorf and Matthew Bradburn.

## REPORTING BUGS
       GNU coreutils online help: <<https://www.gnu.org/software/coreutils/>>
       Report any translation bugs to <<https://translationproject.org/team/>>

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

## SEE ALSO
       [**access**(2)](https://www.chedong.com/phpMan.php/man/access/2/markdown)

       Full documentation <<https://www.gnu.org/software/coreutils/test>>
       or available locally via: info '(coreutils) test invocation'

GNU coreutils 9.4                           January 2026                                     [_TEST_(1)](https://www.chedong.com/phpMan.php/man/TEST/1/markdown)
