Conditional Expressions in Bash

In computer science, conditional statements, conditional expressions, and conditional constructs are features of a programming language, which perform different computations or actions depending on whether a programmer-specified boolean condition evaluates to true or false.

In Bash, conditional expressions are used by the [[ compound command and the [built-in commands to test file attributes and perform string and arithmetic comparisons.

Here is a list of the most popular Bash conditional expressions. You do not have to memorize them by heart. You can simply refer back to this list whenever you need it!

File expressions

  • True if file exists.
[[ -a ${file} ]]
  • True if file exists and is a block special file.
[[ -b ${file} ]]
  • True if file exists and is a character special file.
[[ -c ${file} ]]
  • True if file exists and is a directory.
[[ -d ${file} ]]
  • True if file exists.
[[ -e ${file} ]]
  • True if file exists and is a regular file.
[[ -f ${file} ]]
  • True if file exists and is a symbolic link.
[[ -h ${file} ]]
  • True if file exists and is readable.
[[ -r ${file} ]]
  • True if file exists and has a size greater than zero.
[[ -s ${file} ]]
  • True if file exists and is writable.
[[ -w ${file} ]]
  • True if file exists and is executable.
[[ -x ${file} ]]
  • True if file exists and is a symbolic link.
[[ -L ${file} ]]

String expressions

  • True if the shell variable varname is set (has been assigned a value).
[[ -v ${varname} ]]

True if the length of the string is zero.

[[ -z ${string} ]]

True if the length of the string is non-zero.

[[ -n ${string} ]]
  • True if the strings are equal. = should be used with the test command for POSIX conformance. When used with the [[ command, this performs pattern matching as described above (Compound Commands).
[[ ${string1} == ${string2} ]]
  • True if the strings are not equal.
[[ ${string1} != ${string2} ]]
  • True if string1 sorts before string2 lexicographically.
[[ ${string1} < ${string2} ]]
  • True if string1 sorts after string2 lexicographically.
[[ ${string1} > ${string2} ]]

Arithmetic operators

  • Returns true if the numbers are equal
[[ ${arg1} -eq ${arg2} ]]
  • Returns true if the numbers are not equal
[[ ${arg1} -ne ${arg2} ]]
  • Returns true if arg1 is less than arg2
[[ ${arg1} -lt ${arg2} ]]
  • Returns true if arg1 is less than or equal arg2
[[ ${arg1} -le ${arg2} ]]
  • Returns true if arg1 is greater than arg2
[[ ${arg1} -gt ${arg2} ]]
  • Returns true if arg1 is greater than or equal arg2
[[ ${arg1} -ge ${arg2} ]]

As a side note, arg1 and arg2 may be positive or negative integers.

As with other programming languages you can use AND & OR conditions:

[[ test_case_1 ]] && [[ test_case_2 ]] # And
[[ test_case_1 ]] || [[ test_case_2 ]] # Or

Exit status operators

  • returns true if the the command was successful without any errors
[[ $? -eq 0 ]]
  • returns true if the the command was not successful or had errors
[[ $? -gt 0 ]]

Licenses and Attributions


Speak Your Mind

-->