Bash regex issue

Emmett Culley emmett at webengineer.com
Sat Feb 5 17:39:02 UTC 2011


On 02/05/2011 08:13 AM, Robert Nichols wrote:
> On 02/05/2011 09:51 AM, Emmett Culley wrote:
>> I have a bash script I've been using in CentOS that no longer works in Fedora 14. The pertinent lines are:
>>
>> mac=`echo $2 | tr a-z A-Z`
>> if [[ "$mac" =~ '[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]' ]]; then
>>     echo 'good'
>> else
>>     echo 'Invalid MAC address'
>> fi
>>
>> In CentOS or RHEL5 setting parameter 2 = 00:00:00:00:af:df works as expected, but not in Fedora.  By adding -x to the first line of the script the output to the terminal in CentOS looks like this:
>>
>> ++ echo 00:00:00:00:af:df
>> ++ tr a-z A-Z
>> + mac=00:00:00:00:AF:DF
>> + [[ 00:00:00:00:AF:DF =~ [0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F] ]]
>> + echo good
>> good
>>
>> In Fedora it looks like this:
>>
>> ++ echo 00:00:00:00:af:df
>> ++ tr a-z A-Z
>> + mac=00:00:00:00:AF:DF
>> + [[ 00:00:00:00:AF:DF =~ \[0-9A-F]\[0-9A-F]:\[0-9A-F]\[0-9A-F]:\[0-9A-F]\[0-9A-F]:\[0-9A-F]\[0-9A-F]:\[0-9A-F]\[0-9A-F]:\[0-9A-F]\[0-9A-F] ]]
>> + echo 'Invalid MAC address'
>> Invalid MAC address
>>
>> Note the "\" before each "[" in the regular expression.
>>
>> Any ideas what is going on here?  Is there a better forum to ask this question?
> 
> See the bash FAQ at ftp://ftp.cwru.edu/pub/bash/FAQ item E14 "Why does
> quoting the pattern argument to the regular expression matching
> conditional operator (=~) cause regexp matching to stop working?"
> 

Thanks, that was the clue I needed.

The version of bash in CentOS is 3.2 so according to the page referenced above, it should have worked the same as in Fedora (4.1), but the explanation gave me the clue.

I fixed it by first storing the regex expression in a variable.

regex='[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]'
mac=`echo $2 | tr a-z A-Z`
if [[ "$mac" =~ $regex ]]; then
    echo 'good'
else
    echo 'Invalid MAC address'
fi

Now it works in both CentOS and Fedora, but it is important that you leave $regex unquoted, or you will have the same problem in Fedora.  Unquoted it works in both.



More information about the users mailing list