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