LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Software (http://www.linuxquestions.org/questions/linux-software-2/)
-   -   Multiple string variable comparisons in an if statement in bash (http://www.linuxquestions.org/questions/linux-software-2/multiple-string-variable-comparisons-in-an-if-statement-in-bash-949034/)

buee 06-07-2012 09:55 AM

Multiple string variable comparisons in an if statement in bash
 
I have a number of variables that I need to verify that they match.

I have two databases of usernames, passwords, and speed packages. The database types are not the same. I need to make sure that everything is the same.

Basically:

Code:

if [ $db1user matches $db2user ] and [ $db1pass matches $db2pass ] and [ $db1package matches $db2package ] then

It's good
else

No bueno
$db1user, $db1pass, $db1package
$db2user, $db2pass, $db2package

fi

That's is obviously not a verbatim syntax. But if I posted every combination I've tried, this post would be 8 pages by itself.

I've been searching all morning but can't get the right combination of an if statement comparing multiple variables to other variables, etc. Tried different combinations of [], [[]], quotes, no quotes, -a, =, ==, etc. I'll either get that they all report OK when some are not, or I get that they're all bad when some are good. Or, I get a syntax error, usually with -a as the operator.

What's the proper way to compare 3 pairs of variables to make sure they match exactly.

weibullguy 06-07-2012 10:27 AM

The following works for me
Code:

if[ $db1usr == $db2user -a $db1pass == $db2pass -a $db1package == $db2package ]; then
    echo "Its good"
else
    echo "Its not good"
    echo $db1user $db1pass $db1package
    echo $db2user $db2pass $db2package
fi


buee 06-07-2012 10:51 AM

Quote:

Originally Posted by weibullguy (Post 4697940)
The following works for me
Code:

if[ $db1usr == $db2user -a $db1pass == $db2pass -a $db1package == $db2package ]; then
    echo "Its good"
else
    echo "Its not good"
    echo $db1user $db1pass $db1package
    echo $db2user $db2pass $db2package
fi


That got it! I wish I had written down the dozens of different ways I tried it.

David the H. 06-07-2012 12:33 PM

As long as you're using bash, and comparing text strings, the [[..]] test is safer and more flexible. You can use && and || inside them for and/or operators.

Code:

if [[ "$db1user" == "$db2user" && "$db1pass" == "$db2pass" && "$db1package" == "$db2package" ]]; then

        echo "It's good"
else

        echo "No bueno"

fi

Note also that "==" is not actually valid syntax in the old "[" test, although bash accepts it. You should properly only use the single-character "=" in single-bracket tests.


If you're comparing integers, however, you should use ((..)) instead.

Code:

if (( num1 == num2 && num3 == num4 && num5 == num6 )); then
Where num1-num6 are variables containing integer values.


http://mywiki.wooledge.org/ArithmeticExpression
http://mywiki.wooledge.org/BashFAQ/031
http://wiki.bash-hackers.org/commands/classictest
http://wiki.bash-hackers.org/syntax/...nal_expression


Another option, and perhaps safer, more portable, and more readable in the long run, would be to simply use separate nested if statements.


Finally, remember, QUOTE ALL OF YOUR VARIABLE SUBSTITUTIONS. You should never leave the quotes off a parameter expansion unless you explicitly want the resulting string to be word-split by the shell (globbing patterns are also expanded). This is a vitally important concept in scripting, so train yourself to do it correctly now. You can learn about the exceptions later.

http://mywiki.wooledge.org/Arguments
http://mywiki.wooledge.org/WordSplitting
http://mywiki.wooledge.org/Quotes

This is particularly important when using the old "[" single-bracket test command.

(And actually, one of the benefits of "[[" is that it's one of the exceptions where quotes aren't needed, at least on the left hand side. The right hand side, however, does exhibit differing effects when using "==" and "=~". See the links I gave above for more.)


All times are GMT -5. The time now is 10:34 AM.