Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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?

share|improve this question
add comment

1 Answer

up vote 9 down vote accepted

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
share|improve this answer
    
but with no double quote, we can not use space character in regex pattern. Is there any solution for that? –  Majid Azimi Feb 19 '12 at 17:55
1  
Space should be escaped like \ . –  ДМИТРИЙ МАЛИКОВ Feb 19 '12 at 17:56
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.