From owner-freebsd-hackers Mon Sep 10 8: 4: 9 2001 Delivered-To: freebsd-hackers@freebsd.org Received: from lorax.ubergeeks.com (lorax.ubergeeks.com [209.145.65.55]) by hub.freebsd.org (Postfix) with ESMTP id 5CFE637B40D for ; Mon, 10 Sep 2001 08:04:04 -0700 (PDT) Received: from localhost (adrian@localhost) by lorax.ubergeeks.com (8.11.6/8.11.6) with ESMTP id f8AF3fv37899; Mon, 10 Sep 2001 11:03:44 -0400 (EDT) (envelope-from adrian@ubergeeks.com) Date: Mon, 10 Sep 2001 11:03:41 -0400 (EDT) From: Adrian Filipi-Martin Reply-To: Adrian Filipi-Martin To: Peter Pentchev Cc: Ulf Zimmermann , Subject: Re: Question about what programs to use in /etc/rc* In-Reply-To: <20010910110537.A2053@ringworld.oblivion.bg> Message-ID: <20010910102943.N36056-100000@lorax.ubergeeks.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG 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 -- [ adrian@ubergeeks.com ] To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message