Testing for Equal

Problem

You want to check to see if two shell variables are equal, but there are two different test operators: -eq and = (or ==). So which one should you use?

Solution

The type of comparison you need determines which operator you should use. Use the -eq operator for numeric comparisons and the equality primary = (or ==) for string comparisons.

Discussion

Here’s a simple script to illustrate the situation:

#!/usr/bin/env bash
# cookbook filename: strvsnum
#
# the old string vs. numeric comparison dilemma
#
VAR1=" 05 "
VAR2="5"

printf "%s" "do they -eq as equal? "
if [ "$VAR1" -eq "$VAR2" ]
then
    echo YES
else
    echo NO
fi

printf "%s" "do they = as equal? "
if [ "$VAR1" = "$VAR2" ]
then
    echo YES
else
    echo NO
fi

When we run the script, here is what we get:

$ bash strvsnum
do they -eq as equal? YES
do they = as equal? NO
$

While the numeric value is the same (5) for both variables, Characters such as leading zeros and whitespace can mean that the strings are not equal as strings.

Both = and == are accepted, but the single equal sign follows the POSIX standard and is more portable.

It may help you to remember which comparison to use if you can recognize that the -eq operator is similar to the FORTRAN .eq. operator. (FORTRAN is a very numbers-oriented language, used for scientific computation.) In fact, there are several numerical comparison operators, each similar to an old FORTRAN operator. The abbreviations, all listed in Table 6-3, are rather mnemonic-like and easy to figure out.

Table 6-3. bash’s comparison operators

Numeric

String

Meaning

-lt

<

Less than

-le

<=

Less than or equal to

-gt

>

Greater than

-ge

>=

Greater than or equal to

-eq

=, = =

Equal to

-ne

!=

Not equal to

On the other hand, these are the opposite of Perl, in which eq, ne, etc. are the string operators, while ==, !=, etc. are numeric.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.15.206.25