How to compare strings in Bash

ID : 1236

viewed : 125

Tags : stringbashstring





Top 5 Answer for How to compare strings in Bash

vote vote

97

Using variables in if statements

if [ "$x" = "valid" ]; then   echo "x has the value 'valid'" fi 

If you want to do something when they don't match, replace = with !=. You can read more about string operations and arithmetic operations in their respective documentation.

Why do we use quotes around $x?

You want the quotes around $x, because if it is empty, your Bash script encounters a syntax error as seen below:

if [ = "valid" ]; then 

Non-standard use of == operator

Note that Bash allows == to be used for equality with [, but this is not standard.

Use either the first case wherein the quotes around $x are optional:

if [[ "$x" == "valid" ]]; then 

or use the second case:

if [ "$x" = "valid" ]; then 
vote vote

83

Or, if you don't need an else clause:

[ "$x" == "valid" ] && echo "x has the value 'valid'" 
vote vote

73

a="abc" b="def"  # Equality Comparison if [ "$a" == "$b" ]; then     echo "Strings match" else     echo "Strings don't match" fi  # Lexicographic (greater than, less than) comparison. if [ "$a" \< "$b" ]; then     echo "$a is lexicographically smaller then $b" elif [ "$a" \> "$b" ]; then     echo "$b is lexicographically smaller than $a" else     echo "Strings are equal" fi 

Notes:

  1. Spaces between if and [ and ] are important
  2. > and < are redirection operators so escape it with \> and \< respectively for strings.
vote vote

67

To compare strings with wildcards, use:

if [[ "$stringA" == *$stringB* ]]; then   # Do something here else   # Do something here fi 
vote vote

59

I have to disagree one of the comments in one point:

[ "$x" == "valid" ] && echo "valid" || echo "invalid" 

No, that is not a crazy oneliner

It's just it looks like one to, hmm, the uninitiated...

It uses common patterns as a language, in a way;

And after you learned the language.

Actually, it's nice to read

It is a simple logical expression, with one special part: lazy evaluation of the logic operators.

[ "$x" == "valid" ] && echo "valid" || echo "invalid" 

Each part is a logical expression; the first may be true or false, the other two are always true.

( [ "$x" == "valid" ]  && echo "valid" ) || echo "invalid" 

Now, when it is evaluated, the first is checked. If it is false, than the second operand of the logic and && after it is not relevant. The first is not true, so it can not be the first and the second be true, anyway.
Now, in this case is the the first side of the logic or || false, but it could be true if the other side - the third part - is true.

So the third part will be evaluated - mainly writing the message as a side effect. (It has the result 0 for true, which we do not use here)

The other cases are similar, but simpler - and - I promise! are - can be - easy to read!
(I don't have one, but I think being a UNIX veteran with grey beard helps a lot with this.)

Top 3 video Explaining How to compare strings in Bash







Related QUESTION?