Difference between revisions of "Bash test"

From NovaOrdis Knowledge Base
Jump to: navigation, search
(One intermediate revision by the same user not shown)
Line 24: Line 24:
True if file exists and has a size greater than zero.
True if file exists and has a size greater than zero.
For a zero-length test, use:
[[Wc#-c|wc -c]]

Latest revision as of 23:32, 15 January 2020




'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


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.

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 http://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs


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.