Conditional Expressions. A conditional expression is used with the [[ compound command to test attributes of files and to compare strings.  Field splitting and file name generation are not performed on the words between [[ and ]].  Each expression can be constructed from one or more of the following unary or binary expressions: string True, if string is not null. -a file Same as -e below.  This is obsolete. -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 it has its setgid bit set. -k file True, if file exists and it has its sticky bit set. -n string True, if length of string is non-zero. -o ?option True, if option named option is a valid option name. -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 fildes True, if file descriptor number fildes is open and associated with a terminal device. -u file True, if file exists and it has its setuid bit set. -v name True, if variable name is a valid variable name and is 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 true if 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. -h file True, if file exists and is a symbolic link. -N file True, if file exists and the modification time is greater than the last access time. -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. -R name True if variable name is a name reference. -S file True, if file exists and is a socket. file1 -nt file2 True, if file1 exists and file2 does not, or file1 is newer than file2. file1 -ot file2 True, if file2 exists and file1 does not, or file1 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.  Any part of pattern can be quoted to cause it to be matched as a string.  With a successful match to a pattern, the .sh.match array variable will contain the match and sub-pattern matches. string = pattern Same as == above, but is obsolete. string != pattern True, if string does not match pattern.  When the string matches the pattern the .sh.match array variable will contain the match and sub-pattern matches. string =∼ ere True if string matches the pattern ∼(E)ere where ere is an extended regular expression. string1 < string2 True, if string1 comes before string2 based on the current locale. string1 > string2 True, if string1 comes after string2 based on the current locale. The following obsolete arithmetic comparisons are also permitted: 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.