On Mon, Jun 03, 2002, Nadav Har'El wrote about "Re: small and extremely annoying
question":
> $ dirname /usr/local/bin/gcc
> /usr/local/bin
>
> (or if you're into S&M, you can do the same with the more generic but
> complicated expr tool. Shells like zsh or bash also have builtin features
> that let you do such substitutions).
I figured that since I came out the total idiot (giving the 4th identical
answer in 5 minutes), I'll expand your knowledge by showing *how* this
can be done with expr(1) and using shell builtin features.
expr(1), which I guess most people won't be very familar with, was Unix's
original "bag of tricks", that did things that nowadays are usually either
done in the shell (like incrementing a counter, cutting of parts of
strings) or with specialized utilities like the aforementioned dirname.
For example, to cut off the dirname, one could use
$ expr /usr/local/bin/gcc : '\(.*\)/[^/]*'
/usr/local/bin
What this scary thing (hence the reference to S&M :) ) says is roughly
this: take the first string (/usr/local/bin/gcc) and look for "something"
followed by a slash and then only non-slash characters. Then output that
"something".
A real implementation of dirname in terms of expr can be even uglier: see
if you can understand the following (straight out of Solaris's /bin/dirname):
exec /usr/bin/expr \
"${1:-.}/" : '\(/\)/*[^/]*//*$' \| \
"${1:-.}/" : '\(.*[^/]\)//*[^/][^/]*//*$' \| \
.
expr's other most common use was to add numeric loop to shell scripts, in
which you need to increment your counter variable:
$ expr 7 + 1
8
Nowadays, with more advanced shells like bash and zsh, one would normally
use the shell's builtin features instead of expr. For example (in bash):
$ echo $((7+1))
8
$ let i=7; let i++; echo $i
8
and for the dirname thing:
$ FILE=/usr/local/bin/gcc
$ echo ${FILE%/*}
/usr/local/bin
--
Nadav Har'El | Monday, Jun 3 2002, 23 Sivan 5762
[EMAIL PROTECTED] |-----------------------------------------
Phone: +972-53-245868, ICQ 13349191 |Open your arms to change, but don't let
http://nadav.harel.org.il |go of your values.
=================================================================
To unsubscribe, send mail to [EMAIL PROTECTED] with
the word "unsubscribe" in the message body, e.g., run the command
echo unsubscribe | mail [EMAIL PROTECTED]