On Mon, 10 Sep 2001, Peter Pentchev wrote:

> On Sun, Sep 09, 2001 at 06:06:01PM -0400, Adrian Filipi-Martin wrote:
> > On Sun, 9 Sep 2001, Ulf Zimmermann wrote:
> >
> > > These are some examples strings:
> > >
> > > "dhcp"
> > > "dhcp media 10baseTX"
> > > "media 10baseTX dhcp mediaopt half-duplex"
> > >
> > > The following code will get me inside a if condition:
> > >
> > >   if [ `expr "${ifconfig_args}" : '.*[Dd][Hh][Cc][Pp].*'` -ne 0 ]; then
> > >
> > >           ....
> > >
> > >   fi
> >
> >     You do everything you need within sh.  Someone else pointed out
> > that case/esac is your friend here.  It was not quite complete.  Here's
> > more complete example that will let you pair up the options and their
> > arguments if they take them.
> >
> > ifconfig_args="media 10baseTX dhcp mediaopt half-duplex"
> > set -- ${ifconfig_args}
> > while [ $# -gt 0 ]; do
> >     op=$1
> >     case ${op} in
> >         [Mm][Ee][Dd][Ii][Aa])
> >             op_arg=$2
> >             shift
> >             echo "op=media op_arg=${op_arg}"
> >             ;;
>
> I don't like this.  This second-guessing of ifconfig(8)'s arguments
> is prone to error - consider the case of a new keyword added to
> ifconfig(8)..  And blindly discarding unrecognized keyword would
> not really work either - a new keyword might take an argument,
> the shell script has no way of knowing that, so it would skip
> the keyword and try to look at its argument as another keyword;
> what if a keyword takes a string argument of, oh, say, 'dhcp'? :)

        Sorry, but my example was meant to be more featureful than
necessary and let you strip it down, sinice you needs wern't completely
clear.  If you just want to test for a substring, try this instead:

    case "${ifconfig_args}" in
        *[Dd][Hh][Cc][Pp]*)
            echo "we are using dhcp..."
            ;;
    esac


>
> A ${args#dhcp} might work better, but there is a problem with it -

        The pattern after the # is a regular glob pattern.  You can use
${args#[Dd][Hh][Cc][Pp]} to deal with case.

         You probably really meant to say '${args##*[Dd][Hh][Cc][Pp]*}'
which will collapse to a null string if 'dhcp' is in the string, or the
string is empty to begin with.  With only a single # and no *'s, you will
not modify the string unless it is exactly "dhcp".

        Sill I don't recommend this approach, since you need to test the
string twice, once before and once after the expansion.  The case/esac
idiom is pretty common as well.

        Adrian
--
[ [EMAIL PROTECTED] ]


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to