A binary comparison operator compares two variables or quantities. Note that integer and string comparison use a different set of operators.
is equal to
is not equal to
is greater than
is greater than or equal to
is less than
is less than or equal to
is less than (within double parentheses)
is less than or equal to (within double parentheses)
is greater than (within double parentheses)
is greater than or equal to (within double parentheses)
is equal to
is equal to
This is a synonym for =.
![]() | The == comparison operator behaves differently within a double-brackets test than within single brackets.
|
is not equal to
This operator uses pattern matching within a [[ ... ]] construct.
is less than, in ASCII alphabetical order
Note that the "<" needs to be
escaped within a
is greater than, in ASCII alphabetical order
Note that the ">" needs to be
escaped within a
See Example 26-11 for an application of this comparison operator.
string is null, that is, has zero length
String='' # Zero-length ("null") string variable.
if [ -z "$String" ]
then
echo "\$String is null."
else
echo "\$String is NOT null."
fi # $String is null. |
string is not null.
![]() | The |
Example 7-5. Arithmetic and string comparisons
#!/bin/bash a=4 b=5 # Here "a" and "b" can be treated either as integers or strings. # There is some blurring between the arithmetic and string comparisons, #+ since Bash variables are not strongly typed. # Bash permits integer operations and comparisons on variables #+ whose value consists of all-integer characters. # Caution advised, however. echo if [ "$a" -ne "$b" ] then echo "$a is not equal to $b" echo "(arithmetic comparison)" fi echo if [ "$a" != "$b" ] then echo "$a is not equal to $b." echo "(string comparison)" # "4" != "5" # ASCII 52 != ASCII 53 fi # In this particular instance, both "-ne" and "!=" work. echo exit 0 |
Example 7-6. Testing whether a string is null
#!/bin/bash
# str-test.sh: Testing null strings and unquoted strings,
#+ but not strings and sealing wax, not to mention cabbages and kings . . .
# Using if [ ... ]
# If a string has not been initialized, it has no defined value.
# This state is called "null" (not the same as zero!).
if [ -n $string1 ] # string1 has not been declared or initialized.
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi # Wrong result.
# Shows $string1 as not null, although it was not initialized.
echo
# Let's try it again.
if [ -n "$string1" ] # This time, $string1 is quoted.
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi # Quote strings within test brackets!
echo
if [ $string1 ] # This time, $string1 stands naked.
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi # This works fine.
# The [ ... ] test operator alone detects whether the string is null.
# However it is good practice to quote it (if [ "$string1" ]).
#
# As Stephane Chazelas points out,
# if [ $string1 ] has one argument, "]"
# if [ "$string1" ] has two arguments, the empty "$string1" and "]"
echo
string1=initialized
if [ $string1 ] # Again, $string1 stands unquoted.
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi # Again, gives correct result.
# Still, it is better to quote it ("$string1"), because . . .
string1="a = b"
if [ $string1 ] # Again, $string1 stands unquoted.
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi # Not quoting "$string1" now gives wrong result!
exit 0 # Thank you, also, Florian Wisser, for the "heads-up". |
Example 7-7. zmore
#!/bin/bash
# zmore
# View gzipped files with 'more' filter.
E_NOARGS=65
E_NOTFOUND=66
E_NOTGZIP=67
if [ $# -eq 0 ] # same effect as: if [ -z "$1" ]
# $1 can exist, but be empty: zmore "" arg2 arg3
then
echo "Usage: `basename $0` filename" >&2
# Error message to stderr.
exit $E_NOARGS
# Returns 65 as exit status of script (error code).
fi
filename=$1
if [ ! -f "$filename" ] # Quoting $filename allows for possible spaces.
then
echo "File $filename not found!" >&2 # Error message to stderr.
exit $E_NOTFOUND
fi
if [ ${filename##*.} != "gz" ]
# Using bracket in variable substitution.
then
echo "File $1 is not a gzipped file!"
exit $E_NOTGZIP
fi
zcat $1 | more
# Uses the 'more' filter.
# May substitute 'less' if desired.
exit $? # Script returns exit status of pipe.
# Actually "exit $?" is unnecessary, as the script will, in any case,
#+ return the exit status of the last command executed. |
These are similar to the Bash comparison operators && and ||, used within double brackets.
[[ condition1 && condition2 ]] |
The -o and -a operators work with the test command or occur within single test brackets.
if [ "$exp1" -a "$exp2" ] |
Refer to Example 8-3, Example 26-17, and Example A-31 to see compound comparison operators in action.
| [1] | As S.C. points out, in a compound test,
even quoting the string variable might not
suffice. |