Twitter Updates

    follow me on Twitter

    G-AVLN in front of her home

    G-AVLN in front of her home

    Mostly Unix and Linux topics. But flying might get a mention too.

    Thursday, July 21, 2005

    Counting patterns in KSH

    I was explaining the pattern matching in the shell earlier today, and used a very unfortunate example for explaining the "exactly one" pattern:

    if [[ $var == @([0-9])% ]]; then...

    I have (correctly) explained the above pattern as exactly one digit followed by a percent sign. One of the delegates asked me: why use the fancy characters? Wouldn't the following:

    if [[ $var == [0-9]% ]]; then...

    be the same? And if so, what's the point of the additional characters! Got me going for a moment! The answer is in the poorly chosen example. Although it works, one would never use the 'exact one' counting in relation to a single pattern specification.

    The @(...) notation is used when you need to 'count' alternative patterns, as in:

    if [[ $var == @(+|-)[0-9] ]]; then...

    Without the @ character, the brackets needed for enveloping the alternative patterns would not work:

    if [[ $var == (+|-)[0-9] ]]; then...
    ksh: syntax error: '==' missing second argument

    And without the brackets altogether:
    if [[ $var == +|-[0-9] ]]; then...

    gives:
    ksh: syntax error: '|' unexpected operator/operand

    1 comment:

    Clive said...

    How about:
    [+-][0-9]

    Better yet, use Bash 3.0 with Extended Regular Expressions

    Blog Archive