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

Re: Mix and match parameter expansion flags and sub-scripting flags + quoting

On Fri, Dec 29, 2017 at 7:29 AM, Jim <linux.tech.guy@xxxxxxxxx> wrote:
> Hello,
> The intent is, using only "native zsh" tools, return the 'shell'
> as set in /etc/passwd for my own $USER without using any external
> utilities, gnu or otherwise. As in UNIX/Linux, zsh also has more then
> one way of doing the same thing. So as a training exercise I decided
> to use as many variants as I could to do the same thing. In the process
> I found that what I though would work, did not return the intended
> result.

I haven't gone through your cases in any detail, but there are almost
certainly three things causing your problems:
(1) Nested expansions plus quoting cause an array in the inner
expansion to be joined into a string in most cases, unless you use
special syntax to preserve the array
(2) Single-element arrays behave like scalars (strings) in several cases
(3) Subscript syntax applies to scalars, to extract substrings

Those last two put together can cause a lot of head-scratching.

Recent zsh extended ${(A)array} to mean "assure $array continues to be
treated as an array, even when it would otherwise become a string"
specifically to avoid this issue.  Some of your examples work around
it by using the (w) subscript flag, but that isn't quite the same,
because it still starts from a string and re-splits the string before
indexing.  In older zsh for most cases you can preserve array-ness by
using the (@) flag, there are just a few [item (2) above] where that
didn't work which caused us to provide (A).


% x=("abc def")
% print ${x[1]}
abc def
% print ${${x}[1]}
abc def
% print "${${x}[1]}"
% print ${"${x}"[1]}
% print ${"${x}"[(w)1]}
% print ${"${(A)x}"[1]}
abc def
% print "${${(@)x}[1]}"
abc def

Figuring out at what level of a nested expansion you need to add (A)
or (@) is the other part of the equation.  Sometimes you need to add
an extra level of nesting just to force (A) to be applied to the
correct value.

> My distributions currently distributes ZSH_VERSION 5.3.1.

That should be new enough for (A) to work.

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