Bash test

From NovaOrdis Knowledge Base
Jump to: navigation, search




'test' is a bash built-in command which tests the expression following it, according to the syntax described below. 'test' and [...] are synonymous and can be used interchangeably.


[ ! -f ${file} ] && echo "we're not a file" || echo "we're a file"


True if file exists (regardless of type).


True if file exists and has a size greater than zero.

For a zero-length test, use:

wc -c

This also works:

if [[ -f ${file} ]] && [[ ! -s ${file} ]]; then
  echo "empty"


True if file exists and is a regular file.


True if file exists and is readable.


True if file exists and is writable.


Tests whether the file exists and it is a symbolic link.

[ -h $0 ] && echo "we're a link" || echo "we're not a link"


True if the variable specified after -v has been allocated, even if it has an empty value (blank string):

For the following cases -v some_var evaluates to true:


If the variable is not mentioned at all -v some_var evaluates to false.

In case of indexed or associative arrays, declarations with "declare -a" or "declare -A" are not detected by -v. Only if an array was actually allocated -v returns true. For more details, see Indexed Array Declaration Test, Indexed Array Allocation Test, Associative Array Declaration Test and Associative Array Allocation Test.


True if file exists and is executable.

Integer Comparison

[arg1 -eq|-ne|-lt|-le|-gt|-ge arg2]

String Comparison

< and > can be used for string comparison, in ASCII alphabetical order, but the extended test command [[ ... ]]:

if [[ "${a}" > "${b}" ]]; them

File Time Comparison


if [[ ${file1} -nt ${file2} ]]; then


-z, -n

-z: true if the length of the string is zero.

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

Can be used to check for undeclared variables

[ -z ${var} ] && echo" 'var' not declared"
Quotation marks around the variables are needed, otherwise the expression will fail syntactically when the variable is declared and it contains a space:
var="a b"


line 177: [: 900: binary operator expected

Combining test and Command Conditionals

Not sure if this belongs here, refactor with


if ! ${verbose} && [ "$1" = "--verbose" -o "$1" = "-v" ]; then
    echo "setting verbose to ON"

Must have a space between ! and the command that evaluates to true or false.