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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/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:
1 2 3 4 |
$ 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.