7/14 Shell Programming question: I want to call a script with 1 arg
and have it figure out whether $1 is a MAC address or an IP address
and then do call the appropriate function. What is the best way
to do this, given that sh/bash/ksh do not have something like
the =~ in perl. Check for exit status of grep, or is there a
a better way? For the moment, let's just say the two tests are:
echo $1 | fgrep : > /dev/null && echo isMAC || echo notMAC
echo $1 | fgrep . > /dev/null && echo isIP || echo notIP
and if neither, then Usage()
I want to avoid requiring the user to either do "-i IP" or "-m MAC".
Note: this doesn't have to do extensive syntax checking ... it's
not a security application. Just trying to save typing.
\_ You may want to recheck your assumption of bash not having =~.
\_ Thanks for that information. I didn't know know about that.
Although right now it is in sh. Any portable pure sh ideas?
I'm really interested in what is the "right" way to do this,
rather than just coming up with something which works.
\_ "right" depends on your situation. If you actually need
to support old systems, or be portable across many systems,
then maybe you should stick with sh. If you know your
audience is all going to have bash or whatever (and that
is not at all unlikely these days), then I see no good
reason to suffer under older, less capable tools.
\_ Dude, it's a sh script. If it works, it works. Seriously.
Stick it in a function if it looks too ugly and then forget
about it. If you need something to be maintainable or
it's a called enough there is any concern about it being
too slow you are going to have to bite the bullet and use
a reasonable scripting language. Otherwise just make it work
and move on to something that is worth spending time on.
\_ I think "right" in this case, means readable and maintainable
by the next poor guy that has to come along. Just document
your code and you will be fine.
\- I think one way to distill the question is "how do i get =~
in sh" ... would you do "echo $string | egrep <regexp>" + $?
to get exit status of the grep ... I think the case approach
below is nice and clean as long as you are ok with something
like *:*:*:*:*:* for MACs and *.*.*.* for IPs, and dont need
"true" regexps.
"true" regexps. I wouldnt use awk to test, but maybe if you
need to mangle.
\_ Why would you do this in a shell progam?
\_ use case:
found="NO"
case "$1" in
*:*) echo "isMAC"; found="YES";;
*.*) echo "isIP"; found="YES";;
*) if [ "$found" = "NO" ] ; then
echo "NOT MAC" ; echo "NOT IP";
fi
;;
esac |