Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 08 Aug 2009 11:41:58 -0700
From:      Doug Barton <dougb@FreeBSD.org>
To:        rea-fbsd@codelabs.ru
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Problem in bin/sh stripping the * character through ${expansion%}
Message-ID:  <4A7DC6F6.4010802@FreeBSD.org>
In-Reply-To: <ruze2YSbnZSTRbUbUJTTZyWDlyA@PR865FKBRXbdFBYZMkH1tmebpCc>
References:  <4A7B1DB0.1040602@FreeBSD.org> <ruze2YSbnZSTRbUbUJTTZyWDlyA@PR865FKBRXbdFBYZMkH1tmebpCc>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4A7DC6F6.4010802>