Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Mix and match parameter expansion flags and sub-scripting flags + quoting
- X-seq: zsh-users 23022
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: zsh <zsh-users@xxxxxxx>
- Subject: Re: Mix and match parameter expansion flags and sub-scripting flags + quoting
- Date: Fri, 29 Dec 2017 10:43:30 -0800
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=LitufS1y8jF/C38Krk8Fsc8maMHjTED+7Hoj4NtkClQ=; b=kgv6DfUhse7KcvXmcEYgW7Hw0Ed67F2h9D1By5JZ2CJAn/JloADc0+y7bMwvqShLUL spSIle1nxz3HoQwnQJKEYq3geuvCeBLHmdKqJfvlx0oJ8+I7RyOo7GO10wfxWzL9jAGl KX8eye7aWrlqvwUwoX7q85aPCQXhwLTbCu+QlXsVNbJcgGeBf3hZzvNxZWvv3IqcZi4u drjrpr/RppwlRrzWsxLgC5l/XdClKrrJkaCzzrGrjpvVvGgqtqRVtq3VH0EV0LJcvvU3 aEnAIZNLfidc7HzKxQ0e03VCVPgRcPgCqonN5RSVCRCXKb0aHk2wKxd5TWCofA0imiVl AIwg==
- In-reply-to: <CA+rB6GLSgUkWiBRMmNQ_gc-A2pABpPJVnR8xf9tpYaK3e8JMyQ@mail.gmail.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- List-unsubscribe: <mailto:zsh-users-unsubscribe@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <CA+rB6GLSgUkWiBRMmNQ_gc-A2pABpPJVnR8xf9tpYaK3e8JMyQ@mail.gmail.com>
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).
Compare:
% x=("abc def")
% print ${x[1]}
abc def
% print ${${x}[1]}
abc def
% print "${${x}[1]}"
a
% print ${"${x}"[1]}
a
% print ${"${x}"[(w)1]}
abc
% 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