Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: double quoted expansion question

On Sep 7,  2:31pm, Sebastian Stark wrote:
} Dear zsh users,
} What I would like to understand here is why the output changes the way
} it does when I add double quotes around my expression. I would expect
} the same output as without. If anybody could shed some light please, I
} guess it's just something obvious I cannot see.

It may help to read the "Rules" subsection in the "Parameter Expansion"
section of the zsh manual.

Note that "double quoted joining" happens at step 5, before "modifiers"
[including the //* / replacement] at step 7.  Although "forced splitting"
(the s and f flags) doesn't happen until step 16, "nested substitution"
happens at step 1, so your innermost ${(f)servers} still happens before
double quoted joining is done, and it's the result of that split that is
then joined on spaces, causing //* / to do something you don't expect.

So what you need to do is tell zsh not to join that array, which you do
by adding the @ flag at the nesting level where the join would happen:

    print "${(s:,:uo)${(j:,:)${(@)${(f)servers}//* /}}}"

Also note that "forced joining" (the j flag) is applied at step 5 when
the substitution is in double quotes, but not until step 10 when unquoted.
That matters here only to explain why you need only one @ flag.

BTW, you don't need // there; there is only one space in each array
element after ${(f)servers}, so ${(@)${(f)servers}/* /}} is enough.

Messages sorted by: Reverse Date, Date, Thread, Author