string comparisons
Alex Martelli
alex at am.sublink.org
Tue Mar 19 10:20:33 AEST 1991
wcs at cbnewsh.att.com (Bill Stewart 908-949-0705 erebus.att.com!wcs) writes:
:In article <1991Mar14.225901.3973 at mrspoc.Transact.COM> steven at Transact.COM writes:
:]acmfiu at serss0.fiu.edu (ACMFIU) writes:
:]>under csh or sh, how do i compare two strings?
:]Either use expr(1) or awk(1). Depends on how elaborate you want to get.
:The test program (aka "[") is accessible from either shell, and is a
:builtin for modern shells like ksh. In sh, just do
: if [ "$foo" = "$bar" ]
: then true-stuff
: else false-stuff
I believe that the following approach should be often faster:
case $foo in
"$bar") true-stuff ;;
*) false-stuff ;;
esac
since "case", and the "globbing-like" behavior of its pattern-matching,
IS guaranteed to be builtin to sh. NOT earth-shattering differences,
mind you!, but given these two scripts on my 386/20, Interactive 2.2:
---cut: pep
#!/bin/sh
fai='abe*cou'
ogu='abe*cou'
for i in 0 1 2 3 4 5 6 7 8 9
do
case $fai in
"$ogu") echo "$fai" si! ;;
*) echo "$fai" no! ;;
esac >/dev/null
done
fai='abetocou'
for i in 0 1 2 3 4 5 6 7 8 9
do
case $fai in
"$ogu") echo "$fai" si! ;;
*) echo "$fai" no! ;;
esac >/dev/null
done
---cut: pap
#!/bin/sh
fai='abe*cou'
ogu='abe*cou'
for i in 0 1 2 3 4 5 6 7 8 9
do
if [ $fai = $ogu ]
then echo "$fai" si! ;
else echo "$fai" no! ;
fi >/dev/null
done
fai='abetocou'
for i in 0 1 2 3 4 5 6 7 8 9
do
if [ $fai = $ogu ]
then echo "$fai" si! ;
else echo "$fai" no! ;
fi >/dev/null
done
---end cut
/bin/time says, for pap:
real 1.6
user 0.3
sys 1.2
while for pep:
real 0.5
user 0.0
sys 0.4
with very repeatable measurements (+-0.1 second max on each number
over quite a few repetitions), so the case would appear to be 2 to 3
times faster than the if [ ] (despite the "dilution" of the for,
echos to /dev/null, and other trinkets in common between the two
scripts).
Besides, the globbing in the case statement turns out handy quite
often... (sometimes it's a bother instead - see the above quotes around
"$ogu").
I learned Unix on underpowered/overloaded machines, so my istincts
push me to "optimize" even such trifles. I realize that "if [ ]"
will look more readable/understandable/maintainable than "case" to
most people, and no doubt it may even be faster in shells with test
built-in... so please don't flame on these accounts! I'm just trying
to suggest an alternative technique that may avoid some extra forks
in more "traditional" sh's.
--
Alex Martelli - (home snailmail:) v. Barontini 27, 40138 Bologna, ITALIA
Email: (work:) martelli at cadlab.sublink.org, (home:) alex at am.sublink.org
Phone: (work:) ++39 (51) 371099, (home:) ++39 (51) 250434;
Fax: ++39 (51) 366964 (work only), Fidonet: 332/401.3 (home only).
More information about the Comp.unix.shell
mailing list