Re: Bash regex issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

-- 
users mailing list
users@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe or change subscription options:
https://admin.fedoraproject.org/mailman/listinfo/users
Guidelines: http://fedoraproject.org/wiki/Mailing_list_guidelines


[Index of Archives]     [Current Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]     [Fedora Docs]

  Powered by Linux