• Uncategorized

About bash : How-do-I-compare-two-string-variables-in-an-if-statement-in-Bash-duplicate

Question Detail

I’m trying to get an if statement to work in Bash (using Ubuntu):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

I’ve tried various forms of the if statement, using [["$s1" == "$s2"]], with and without quotes, using =, == and -eq, but I still get the following error:

[hi: command not found

I’ve looked at various sites and tutorials and copied those, but it doesn’t work – what am I doing wrong?

Eventually, I want to say if $s1 contains $s2, so how can I do that?

I did just work out the spaces bit… :/ How do I say contains?

I tried

if [[ "$s1" == "*$s2*" ]]

but it didn’t work.

Question Answer

For string equality comparison, use:

if [[ "$s1" == "$s2" ]]

For string does NOT equal comparison, use:

if [[ "$s1" != "$s2" ]]

For the a contains b, use:

if [[ $s1 == *"$s2"* ]]

(and make sure to add spaces between the symbols):

Bad:

if [["$s1" == "$s2"]]

Good:

if [[ "$s1" == "$s2" ]]

You need spaces:

if [ "$s1" == "$s2" ]

You should be careful to leave a space between the sign of ‘[‘ and double quotes where the variable contains this:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

The ^s show the blank spaces you need to leave.

I suggest this one:

if [ "$a" = "$b" ]

Notice the white space between the openning/closing brackets and the variables and also the white spaces wrapping the ‘=’ sign.

Also, be careful of your script header. It’s not the same thing whether you use

#!/bin/bash

or

#!/bin/sh

Here’s the source.

Bash 4+ examples. Note: not using quotes will cause issues when words contain spaces, etc. Always quote in Bash IMO.

Here are some examples Bash 4+:

Example 1, check for ‘yes’ in string (case insensitive):

if [[ "${str,,}" == *"yes"* ]] ;then

Example 2, check for ‘yes’ in string (case insensitive):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Example 3, check for ‘yes’ in string (case sensitive):

 if [[ "${str}" == *"yes"* ]] ;then

Example 4, check for ‘yes’ in string (case sensitive):

 if [[ "${str}" =~ "yes" ]] ;then

Example 5, exact match (case sensitive):

 if [[ "${str}" == "yes" ]] ;then

Example 6, exact match (case insensitive):

 if [[ "${str,,}" == "yes" ]] ;then

Example 7, exact match:

 if [ "$a" = "$b" ] ;then

This question has already great answers, but here it appears that there is a slight confusion between using single equal (=) and double equals (==) in

if [ "$s1" == "$s2" ]

The main difference lies in which scripting language you are using. If you are using Bash then include #!/bin/bash in the starting of the script and save your script as filename.bash. To execute, use bash filename.bash – then you have to use ==.

If you are using sh then use #!/bin/sh and save your script as filename.sh. To execute use sh filename.sh – then you have to use single =. Avoid intermixing them.

I would suggest:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

Without the double quotes and with only one equals.

$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$

I don’t have access to a Linux box right now, but [ is actually a program (and a Bash builtin), so I think you have to put a space between [ and the first parameter.

Also note that the string equality operator seems to be a single =.

This is more a clarification than an answer! Yes, the clue is in the error message:

[hi: command not found

which shows you that your “hi” has been concatenated to the “[“.

Unlike in more traditional programming languages, in Bash, “[” is a command just like the more obvious “ls”, etc. – it’s not treated specially just because it’s a symbol, hence the “[” and the (substituted) “$s1” which are immediately next to each other in your question, are joined (as is correct for Bash), and it then tries to find a command in that position: [hi – which is unknown to Bash.

In C and some other languages, the “[” would be seen as a different “character class” and would be disjoint from the following “hi”.

Hence you require a space after the opening “[“.

Use:

#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Adding an additional string inside makes it more safe.

You could also use another notation for single-line commands:

[ "x$s1" == "x$s2" ] && echo match

For a version with pure Bash and without test, but really ugly, try:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Explanation: In ( )an extra subshell is opened. It exits with 0 if there was a match, and it tries to exit with $s1 if there was no match which raises an error (ugly). This error is directed to /dev/null.

You may also like...

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.