Table of Contents

CONDITIONAL EXPRESSIONS

A conditional expression is used with the [[ compound command to test attributes of files and to compare strings. Each expression can be constructed from one or more of the following unary or binary expressions:
-a file
true if file exists.

-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.

-f file
true if file exists and is an ordinary file.

-g file
true if file exists and has its setgid bit set.

-h file
true if file exists and is a symbolic link.

-k file
true if file exists and has its sticky bit set.

-n string
true if length of string is non-zero.

-o option
true if option named option is on.

-p file
true if file exists and is a fifo special file or a pipe.

-r file
true if file exists and is readable by current process.

-s file
true if file exists and has size greater than zero.

-t fd
true if file descriptor number fd is open and associated with a terminal device. (note: fd is not optional)

-u file
true if file exists and has its setuid bit set.

-w file
true if file exists and is writable by current process.

-x file
true if file exists and is executable by current process. If file exists and is a directory, then the current process has permission to search in the directory.

-z string
true if length of string is zero.

-L file
true if file exists and is a symbolic link.

-O file
true if file exists and is owned by the effective user id of this process.

-G file
true if file exists and its group matches the effective group id of this process.

-S file
true if file exists and is a socket.

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.

string = pattern
true if string matches pattern.

string != pattern
true if string does not match pattern.

string1 < string2
true if string1 comes before string2 based on ASCII value of their characters.

string1 > string2
true if string1 comes after string2 based on ASCII value of their characters.

exp1 -eq exp2
true if exp1 is equal to exp2.

exp1 -ne exp2
true if exp1 is not equal to exp2.

exp1 -lt exp2
true if exp1 is less than exp2.

exp1 -gt exp2
true if exp1 is greater than exp2.

exp1 -le exp2
true if exp1 is less than or equal to exp2.

exp1 -ge exp2
true if exp1 is greater than or equal to exp2.

( exp )
true if exp is true.

! exp
true if exp is false.

exp1 && exp2
true if exp1 and exp2 are both true.

exp1 || exp2
true if either exp1 or exp2 is true.

In each of the above expressions, if file is of the form /dev/fd/n, where n is an integer, then the test applied to the open file whose descriptor number is n, even if the underlying system does not support the /dev/fd directory.


Mark D. Borges