It seems that these two operators are pretty much the same - is there a difference? When should I use = and when ==?
2 Answers
You must use == in numeric comparisons in (( ... )):
$ if (( 3 == 3 )); then echo "yes"; fi yes $ if (( 3 = 3 )); then echo "yes"; fi bash: ((: 3 = 3 : attempted assignment to non-variable (error token is "= 3 ") You may use either for string comparisons in [[ ... ]] or [ ... ] or test:
$ if [[ 3 == 3 ]]; then echo "yes"; fi yes $ if [[ 3 = 3 ]]; then echo "yes"; fi yes $ if [ 3 == 3 ]; then echo "yes"; fi yes $ if [ 3 = 3 ]; then echo "yes"; fi yes $ if test 3 == 3; then echo "yes"; fi yes $ if test 3 = 3; then echo "yes"; fi yes "String comparisons?", you say?
$ if [[ 10 < 2 ]]; then echo "yes"; fi # string comparison yes $ if (( 10 < 2 )); then echo "yes"; else echo "no"; fi # numeric comparison no $ if [[ 10 -lt 2 ]]; then echo "yes"; else echo "no"; fi # numeric comparison no 2 Comments
chepner
You should not use
== with [ or test, though. == is not part of the POSIX specification, and will not work with all shells (dash, in particular, does not recognize it).Dennis Williamson
@chepner: That's true, but the question is specifically about Bash.
There's a subtle difference with regards to POSIX. Excerpt from the Bash reference:
string1 == string2
True if the strings are equal.=may be used in place of==for strict POSIX compliance.
1 Comment
T.E.D.
No difference in bash though? Just a portability issue?