Date: Thu, 24 Jun 2010 08:34:07 -1000 From: parv@pair.com To: Carl Johnson <carlj@peak.org> Cc: freebsd-questions@freebsd.org Subject: Re: check for numeric content in a shell script (FreeBSD sh) Message-ID: <20100624183407.GA49923@holstein.holy.cow> In-Reply-To: <87d3vgmj1s.fsf@cjlinux.localnet> References: <4C22B3D7.6070102@comclark.com> <20100624033257.2D074BEA6@kev.msw.wpafb.af.mil> <87lja4mlme.fsf@cjlinux.localnet> <87hbksmk6y.fsf@cjlinux.localnet> <87d3vgmj1s.fsf@cjlinux.localnet>
next in thread | previous in thread | raw e-mail | index | archive | help
in message <87d3vgmj1s.fsf@cjlinux.localnet>,
wrote Carl Johnson thusly...
>
> Carl Johnson <carlj@peak.org> writes:
>
> > Carl Johnson <carlj@peak.org> writes:
> >
> >> vogelke+unix@pobox.com (Karl Vogel) writes:
> >>
> >>>>> On Thu, 24 Jun 2010 09:24:39 +0800,
> >>>>> Aiza <aiza21@comclark.com> said:
> >>>
> >>> A> Receiving a variable from the command line that is suppose
> >>> A> to contain
> >>> A> numeric values. How do I code a test to verify the content
> >>> A> is numeric?
> >>>
> >>> The script below will work with the Bourne or Korn shell.
> >>> Results for "0 1 12 1234 .12 1.234 12.3 1a a1":
> >>>
> >>> 0 is numeric
> >>> 1 is numeric
> >>> 12 is numeric
> >>> 1234 is numeric
> >>> .12 is numeric
> >>> 1.234 is numeric
> >>> 12.3 is numeric
> >>> 1a is NOT numeric
> >>> a1 is NOT numeric
> >>
> >> You might want to try testing "123..45".
> >> I tried changing:
> >>> if expr "$arg" : "[0-9]*[\.0-9]*$" > /dev/null
> >> to:
> >> if expr "$arg" : "[0-9]*\.*[0-9]*$" > /dev/null
> >> but it still claims that it is numeric, so *I* must be missing
> >> something.
> >
> > I just realized that I had a stupid mistake there and should
> > have used:
> > if expr "$arg" : "[0-9]*\.[0-9]*$" > /dev/null
> And of course that was another stupid mistake that I didn't test
> properly. I really wanted 0 or 1 decimal points, so I wanted
> '\.\?', except that FreeBSD expr doesn't recognize '\?'. I
> finally ended up with the following which seems to work as *I*
> expected it to work:
> if expr "$arg" : "[1-9]*\.\{0,1\}[0-9]*$" > /dev/null
That regex considers "." a number but not "0.9" (this one seems to
be due to typo) nor a negative number.
I would personally to use egrep or awk (printf "%s" "${arg}" | egrep
"${regex}" [0]) instead of expr.
- parv
[0] Compact regex ....
# Matches a number, either positive (without '+' sign) or
# negative, which is either a whole number; or a real number
# ending with decimal point, or a real number with or without
# leading digits before the decimal point.
^
-?
(
[0-9] [.]? [0-9]*
|
[0-9]? [.] [0-9]+
)
$
...by removing whitespace before use.
--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100624183407.GA49923>
