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?
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.
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 |
---|---|---|
| < | Less than |
| <= | Less than or equal to |
| > | Greater than |
| >= | Greater than or equal to |
| =, = = | Equal to |
| != | 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.
3.15.206.25