Using regex inside if clause in bash

Look at this if block:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

This should print “matched”, but it doesn’t. Where am I going wrong?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You need to remove the quoting in the regex match.

if [[ ${str} =~ m.m ]]; then

From the bash man page:

[…] An additional binary operator, =~, is available, with the same
precedence as == and !=. When it is used, the string to the
right of the operator is considered an extended regular expres‐
sion and matched accordingly (as in regex(3)). The return value
is 0 if the string matches the pattern, and 1 otherwise. If the
regular expression is syntactically incorrect, the conditional
expression’s return value is 2. If the shell option nocasematch
is enabled, the match is performed without regard to the case of
alphabetic characters. Any part of the pattern may be quoted to
force it to be matched as a string.

So with the quotes, you’re using good-old string matching.

If you need spaces in the pattern, just escape them:

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x