A conditional expression is used with the [[(double bracket) compound command to test attributes of files and to compare strings. Word splitting and file name substitution are not performed on words appearing between [[ and ]](double brackets). Each expression is constructed from one or more of the following unary or binary expressions:
-a File | True, if the specified file is a symbolic link that points to another file that does exist. |
-b File | True, if the specified file exists and is a block special file. |
-c File | True, if the specified file exists and is a character special file. |
-d File | True, if the specified file exists and is a directory. |
-e File | True, if the specified file exists. |
-f File | True, if the specified file exists and is an ordinary file. |
-g File | True, if the specified file exists and its setgid bit is set. |
-h File | True, if the specified file exists and is a symbolic link. |
-k File | True, if the specified file exists and its sticky bit is set. |
-n String | True, if the length of the specified string is nonzero. |
-o Option | True, if the specified option is on. |
-p File | True, if the specified file exists and is a FIFO special file or a pipe. |
-r File | True, if the specified file exists and is readable by the current process. |
-s File | True, if the specified file exists and has a size greater than 0. |
-t FileDescriptor | True, if specified file descriptor number is open and associated with a terminal device. |
-u File | True, if the specified file exists and its setuid bit is set. |
-w File | True, if the specified file exists and the write bit is on. However, the file will not be writable on a read-only file system even if this test indicates true. |
-x File | True, if the specified file exists and the execute flag is on. If the specified file exists and is a directory, then the current process has permission to search in the directory. |
-z String | True, if length of the specified string is 0. |
-L File | True, if the specified file exists and is a symbolic link. |
-O File | True, if the specified file exists and is owned by the effective user ID of this process. |
-G File | True, if the specified file exists and its group matches the effective group ID of this process. |
-S File | True, if the specified 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. |
String1 = String2 | True, if String1 is equal to String2. |
String1 != String2 | True, if String1 is not equal to String2. |
String = Pattern | True, if the specified string matches the specified pattern. |
String != Pattern | True, if the specified string does not match the specified pattern. |
String1 < String2 | True, if String1 comes before String2 based on the ASCII value of their characters. |
String1 > String2 | True, if String1 comes after String2 based on the ASCII value of their characters. |
Expression1 -eq Expression2 | True, if Expression1 is equal to Expression2. |
Expression1 -ne Expression2 | True, if Expression1 is not equal to Expression2. |
Expression1 -lt Expression2 | True, if Expression1 is less than Expression2. |
Expression1 -gt Expression2 | True, if Expression1 is greater than Expression2. |
Expression1 -le Expression2 | True, if Expression1 is less than or equal to Expression2. |
Expression1 -ge Expression2 | True, if Expression1 is greater than or equal to Expression2. |
Note: In each of the previous expressions, if the File variable is similar to /dev/fd/n, where n is an integer, then the test is applied to the open file whose descriptor number is n.
You can construct a compound expression from these primitives by using any of the following expressions, listed in decreasing order of precedence:
(Expression) | True, if the specified expression is true. Used to group expressions. |
! Expression | True, if the specified expression is false. |
Expression1 && Expression2 | True, if Expression1 and Expression2 are both true. |
Expression1 || Expression2 | True, if either Expression1 or Expression2 is true. |