Cas van Noort
Cas van Noort

Reputation: 255

Two equal strings evaluate as not equal in bash

Code:

DKIM_RECORD='v=DKIM1\;t=s\;n=core\;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0WehGwX2nEq4WY3OmiGnYtRt2941lJBsoDMV485apTs4MagWxuzRCkil7/A9fV/FJdt+bzRcdgurcZBbrwI5PpfACUP4ghL9ZU8H9lwbWIGNu0hpqEE+0cdigB1S54B7Fj/AXx5hA9nBuNA27KD+hpBx4ToUIDhDFy9A6BodO6yHr/CkccGuZJO7dMPMWyycx+CTaJSB4fDQmwtPbYf9NHaucud0h902DIajfiJpZ4CEvCjNU8pcsAXecCBLqnWLkj2b7AxYpX+A4+z1GR5mul1IQQcfkspm1v/ihdWZ+FogtquMpos9u+6OSnXkQfYW83XED6hNE335kgoSDAWgQIDAQAB'
DKIM_RESPONSE=`dig @ns0.transip.net default._domainkey.randomdomain.nl TXT +short | tr -d '" ' `

if [[ $DKIM_RESPONSE != $DKIM_RECORD ]]; then
    echo "$DKIM_RESPONSE"
    echo "$DKIM_RECORD"
    echo "randomdomain.nl: DKIM failed"
fi

Result:

v=DKIM1\;t=s\;n=core\;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0WehGwX2nEq4WY3OmiGnYtRt2941lJBsoDMV485apTs4MagWxuzRCkil7/A9fV/FJdt+bzRcdgurcZBbrwI5PpfACUP4ghL9ZU8H9lwbWIGNu0hpqEE+0cdigB1S54B7Fj/AXx5hA9nBuNA27KD+hpBx4ToUIDhDFy9A6BodO6yHr/CkccGuZJO7dMPMWyycx+CTaJSB4fDQmwtPbYf9NHaucud0h902DIajfiJpZ4CEvCjNU8pcsAXecCBLqnWLkj2b7AxYpX+A4+z1GR5mul1IQQcfkspm1v/ihdWZ+FogtquMpos9u+6OSnXkQfYW83XED6hNE335kgoSDAWgQIDAQAB
v=DKIM1\;t=s\;n=core\;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0WehGwX2nEq4WY3OmiGnYtRt2941lJBsoDMV485apTs4MagWxuzRCkil7/A9fV/FJdt+bzRcdgurcZBbrwI5PpfACUP4ghL9ZU8H9lwbWIGNu0hpqEE+0cdigB1S54B7Fj/AXx5hA9nBuNA27KD+hpBx4ToUIDhDFy9A6BodO6yHr/CkccGuZJO7dMPMWyycx+CTaJSB4fDQmwtPbYf9NHaucud0h902DIajfiJpZ4CEvCjNU8pcsAXecCBLqnWLkj2b7AxYpX+A4+z1GR5mul1IQQcfkspm1v/ihdWZ+FogtquMpos9u+6OSnXkQfYW83XED6hNE335kgoSDAWgQIDAQAB
randomdomain.nl: DKIM failed

Somehow both string seem equal, but bash evaluates as inequal. What's going wrong here?

Upvotes: 2

Views: 1033

Answers (1)

chepner
chepner

Reputation: 531325

When the right-hand argument of the != is not quoted, it is treated as a pattern to match against, not a literal string to compare to. DKIM_RECORD contains a backslash, so when its expansion is interpreted as a pattern, the backslash is used to escape the following character, then is removed. This means the value on the left no longer matches the value on the right. A smaller example should make it clearer.

$ foo="x\;y"
$ bar="x\;y"
# Here, the value of foo is matched against the pattern "x;y"
$ [[ $foo != $bar ]] && echo no match
no match
# Here, the value of $foo is compared to the string "x\;y"
$ [[ $foo != "$bar" ]] && echo no match
$

You simply need to quote the right-hand argument:

if [[ $DKIM_RESPONSE != "$DKIM_RECORD" ]]; then

Upvotes: 9

Related Questions