Tatavarty Kalyan schrieb am 07.09.2006 um 14:20:43 (+0800):
> On 9/6/06, Chris F.A. Johnson <cfajohnson@gmail.com> wrote:
> >
> >On 2006-09-06, Andreas Schwab wrote:
> >> prj@po.cwru.edu (Paul Jarc) writes:
> >>
> >>> Mike Frysinger <vapier@gentoo.org> wrote:
> >>>> this little bit of code doesnt work right:
> >>>> foo() { echo "${1:-a{b,c}}" ; }
> >
> > The first '}' is interpreted as the end of the parameter expansion.
It depends on the number of parameters, if the first or second brace is
taken. So this is very likely a Bug. ;)
That means in the case
foo a
the first brace is taken.
And in the case
foo
the second one does the termination.
> > Quote them, and they do expand:
> >
> >$ foo() { echo "${1:-"a{b,c}"}" ; }
> >$ foo
> >ab ac
> >
> > However, there is a problem:
> >
> >$ foo 1
> >1 1
> >
> > Where is the second '1' coming from?
>
> It seems
>
> foo() { echo "${1:-"a{b,c}"}" ; } expands to
>
> foo() { echo ${1:-ab} ${1:-ac} ; }
Not exactly, it is acting like:
foo() { echo "${1:-ab}" "${1:-ac}" ; }
To check the first assumption, that there are two parameters to echo, use
the
call without any parameters to foo:
$ foo
ab ac
$
The show the second, apply a string with spaces:
$ foo() { echo "${1:-"a{b,c}"}" ; }
$ foo " x "
x x
$
It is because the string
a{b,c}
is outside of the quotes. So the brace expansion comes first and
duplicates
the arguments to the echo call.