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. ...

Get bash Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.