Reputation: 3165
Anyone know why this happens? Is this a bug of bash?
x='mnt:[4026532411]'
[[ $x == $x ]] && echo OK
I am expecting result OK
, but it did not.
Of course, this works
[[ "$x" == "$x" ]] && echo OK
But as I know, bash [[ ]] have a merit that no need to quote var when compare.
x='a b'
[[ $x == $x ]] && echo OK
works.
Ironical things is
x='mnt:[4026532411]'
[[ $x != $x ]] && echo Oh my god
result is Oh my god
Upvotes: 19
Views: 1039
Reputation: 311998
What you are seeing is do do this sentence from the bash
man page:
When the == and != operators are used, the string to the right of the operator is considered a pattern and matched according to the rules described below under Pattern Matching, as if the extglob shell option were enabled.
As you may already know, [...]
in the shell allows matching from a
group of characters. That is, given the files:
$ ls
fileA fileB fileC fileD
Running ls file[AB]
will yield:
fileA fileB
So in your expression, mnt:[1234]
is interpreted in a similar
fashion.
Upvotes: 6
Reputation: 531718
The unquoted right-hand side of ==
and !=
is treated as a pattern, not a literal string. mnt:[4026532411]
will match mnt:
followed by exactly one of 0, 1, 2, 3, 4, 5, or 6, since the patterns mnt:[4026532411]
and mnt:[0123456]
are equivalent. To match the lieral string, you need to quote the expansion.
x='mnt:[4026532411]'
[[ $x == "$x" ]] && echo OK
Upvotes: 19