Problem in bin/sh stripping the * character through
${expansion%}
Jilles Tjoelker
jilles at stack.nl
Fri Sep 11 23:14:24 UTC 2009
On Fri, Aug 07, 2009 at 03:26:50AM +0400, Eygene Ryabinkin wrote:
> Thu, Aug 06, 2009 at 11:15:12AM -0700, Doug Barton wrote:
> > I came across this problem during a recent portmaster update. When
> > trying to strip off the * character using variable expansion in bin/sh
> > it doesn't work. Other "special" characters do work if they are
> > properly escaped.
> > The attached mini-script clearly shows the problem:
> > $ sh sh-strip-problem
> > var before stripping: foo\*
> > var after stripping: foo\*
> > var before stripping: foo\$
> > var after stripping: foo\
> According to the sh(1), it is not a problem. Namely,
> - \* being unquoted at all will produce a lone '*';
> - '*' when treated as the smallest pattern, will result in a stripping
> of a zero-length string -- it is the smallest pattern in the case of
> '*' that matches anything.
That is indeed an explanation why it works that way, but I think it is
wrong. Generally, the shell command language avoids unnecessary levels
of quoting. In the POSIX spec, "Shell Command Language", note the part
about "${x#*}" (pattern) and ${x#"*"} (literal asterisk). Also compare
with case $something in \*) echo asterisk;; esac which matches a
literal asterisk.
Two PRs already exist for aspects of stripping: bin/57554 (double
quotes) and bin/117748 (trying to match pattern matching characters
literally).
> In order to strip the trailing star you should use
> -----
> var=${var%[*]}
> -----
> This gives you the pattern of '[*]' that is properly treated as the
> single star -- it's a weird way to escape the star in the patterns.
This is indeed a good workaround.
--
Jilles Tjoelker
More information about the freebsd-hackers
mailing list