Problem in bin/sh stripping the * character through ${expansion%}

Doug Barton dougb at FreeBSD.org
Sat Aug 8 18:42:06 UTC 2009


Eygene Ryabinkin wrote:
> Doug, good day.
> 
> 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 '*';

Bzzzt!  :)

Backslash
A backslash preserves the literal meaning of the following char-
acter, with the exception of the newline character (`\n').  A
backslash preceding a newline is treated as a line continuation.

>  - '*' 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.

I agree with you if I had done ${var%*}, but the backslash should be
preventing the * from being interpreted as part of the variable
expansion.

> 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.

That's creative, and better than the kludge I worked up for
portmaster, thanks.

> I will try to look at the XCU to understand what is the POSIX
> way of doing the things.

Great, thanks.

Doug
-- 

    This .signature sanitized for your protection



More information about the freebsd-hackers mailing list