Linux shell programming string compare syntax
What is the difference between = and == to compare strings in Linux shell programming?
Maybe the following code works:
if [ "$NAME" = "user" ] then echo "your name is user" fi
But I think it's not a correct syntax. It would be used to compare string by == statement.
What is correct?
Answers
These pages explain the various comparison operators in bash:
- http://www.tech-recipes.com/rx/209/bournebash-shell-scripts-string-comparison/
- http://tldp.org/LDP/abs/html/comparison-ops.html
- http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss11.2
On the second linked page, you will find:
== is equal to if [ "$a" == "$b" ] This is a synonym for =.
The single equal is correct
string1 == string2
string1 = string2
True if the strings are equal. ‘=’ should be used with the test command for POSIX conformance
NAME="rafael" USER="rafael" if [ "$NAME" = "$USER" ]; then echo "Hello" fi
In general, the = operator works the same as == when comparing strings.
Note: The == comparison operator behaves differently within a double-brackets test than within single brackets.
[[ $a == z* ]] # True if $a starts with an "z" (pattern matching). [[ $a == "z*" ]] # True if $a is equal to z* (literal matching). [ $a == z* ] # File globbing and word splitting take place. [ "$a" == "z*" ] # True if $a is equal to z* (literal matching).
source: http://tldp.org/LDP/abs/html/comparison-ops.html
you can take a look here or here. Personally, to compare strings, I use case
case "$string1" in "$string2" ) echo "matched";; *) echo "not matched";; esac
I do not have to know which operator i should use