Regular expressions

Reid Linnemann lreid at cs.okstate.edu
Mon Aug 20 09:59:09 PDT 2007


Written by Christer Hermansson on 08/18/07 18:08>>
> Derek Ragona wrote:
>> At 12:04 PM 8/18/2007, Christer Hermansson wrote:
>>> I also found some basic example at 
>>> http://www.grymoire.com/Unix/Sh.html#uh-88 :
>>>
>>> --------8<--------8<--------8<--------8<--------8<--------
>>>
>>> #!/bin/sh
>>>
>>> echo "Type in a number"
>>> read ans
>>> number=`expr "$ans" : "([0-9]*)"`
>>> if [ "$number" != "$ans" ]; then
>>> echo "Not a number"
>>> elif [ "$number" -eq 0 ]; then
>>> echo "Nothing was typed"
>>> else
>>> echo "$number is a fine number"
>>> fi
>>>
>>> --------8<--------8<--------8<--------8<--------8<--------
>>>
>>> The above example doesn't work on my freebsd box. Maybe I need to 
>>> update my system, sitting with 6.0R which never been updated.
>>>
>>
>> You have a syntax error using expr.  Do a man on expr for more details 
>> but if you change that line from:
>> number=`expr "$ans" : "([0-9]*)"`
>> to:
>> number=`expr "$ans" : "\([0-9]*\)"`
>>
>> You will get the desired results.
>>
>> Also when debugging scripts remember to add:
>> set -x
>> to your script on the second line, and see what the script lines are 
>> actually doing.
>>
>>         -Derek
>>
> Thanks Derek ! Now both the example and my own code works for me. I 
> changed my code from "^[A-Za-z0-9_-]+$" to "\([A-Za-z0-9_-]*\)" It seems 
> that FreeBSD's expr want some different syntax than the webbased test 
> tool at http://regexlib.com/RETester.aspx
> 

No, your expression is double quoted, which means the shell will expand 
it before passing it to expr. Parens are expanded by shells, they 
manipulate the order of operations (i.e. 'echo 1 || echo 2 && echo 3' 
vs. '(echo 1 || echo 2) && echo 3'). As a result, you must escape the 
parens or the shell will gobble them up.


More information about the freebsd-questions mailing list