From: "Lawrence Velázquez" <larryv@zsh.org>
To: zsh-users@zsh.org
Subject: Re: triviality regarding $# counts
Date: Fri, 12 Apr 2024 00:55:07 -0400 [thread overview]
Message-ID: <e893a082-4b27-4588-9062-ee83ed4ff32d@app.fastmail.com> (raw)
In-Reply-To: <97793422-1543-4ba6-b52b-ff93eba03ab1@eastlink.ca>
On Wed, Apr 10, 2024, at 8:56 PM, Ray Andrews wrote:
> This works: (Again, this is deep in a function and I have to use eval.)
If eval really is necessary (to be frank, I don't trust your judgment
on this), show us examples that require it, instead of the misleading
Rube Goldberg machines you've been offering.
> output=$( eval "$@" ) # '$@' will expand to 'print -l $temp'
> which is the text above.
> temp=( $( eval $@ ) ) # To get the correct count I need to force
> an array.
> linecount=$#temp
> print -rl -- $output
> print $linecount
The count is correct by accident. Your unquoted command substitution
drops the two empty lines but splits the two lines you say should not
be split.
% orig='abc
quote>
quote> def ghi
quote> jkl mno
quote>
quote> pqr'
% arr=($(print -r -- $orig))
% typeset -p arr
typeset -a arr=( abc def ghi jkl mno pqr )
> Various experiments trying to get the correct linecount (23)
There are 25 lines, not 23.
> Different efforts at quoting or using ' ${(@f) ....} ' and various
> other tricks yield me a linecount of 1, 3, 23, 25, 26, or 738. And
> output that deletes the blank lines, or forces everything into one
> 'line/element'. Basically I need the array form to to get the line
> count, but it won't print properly as an array. Not that it's worth
> much trouble, but is it possible to get the variable to print
> correctly *and* show the count of lines without having to eval it
> twice?
% cat foo.zsh
orig='abc
def ghi
jkl mno
pqr'
# The sensible way to split on LFs.
#arr=("${(@f)orig}")
# A very silly way to split on LFs. Use double quotes to
# prevent the result of $(...) from being split and to retain
# empty words in the result of ${(@)...}.
arr=("${(@f)$(print -r -- $orig)}")
typeset -p arr
print -r -- $#arr
# Use double-quoted $arr[@] to retain empty elements. Use
# "print -C1" to avoid printing an empty line if "arr" is empty.
print -rC1 -- "$arr[@]"
% zsh ./foo.zsh
typeset -a arr=( abc '' 'def ghi' 'jkl mno' '' pqr )
6
abc
def ghi
jkl mno
pqr
%
> ... as it is, it seems that '$#' never counts the lines of output as it
> actually prints.
You both populate and print your array incorrectly. For the umpteenth
time, you should use "typeset -p" to inspect your variables' values.
--
vq
next prev parent reply other threads:[~2024-04-12 4:58 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-11 0:56 Ray Andrews
2024-04-12 4:55 ` Lawrence Velázquez [this message]
2024-04-12 14:48 ` Ray Andrews
2024-04-12 19:09 ` Bart Schaefer
2024-04-13 1:13 ` Ray Andrews
2024-04-13 1:33 ` Mark J. Reed
2024-04-13 2:28 ` Ray Andrews
2024-04-13 3:25 ` Lawrence Velázquez
2024-04-13 14:37 ` Ray Andrews
2024-04-13 15:14 ` Ray Andrews
2024-04-13 17:19 ` Mark J. Reed
2024-04-13 17:27 ` Mark J. Reed
2024-04-13 18:08 ` Ray Andrews
2024-04-13 19:45 ` Bart Schaefer
2024-04-13 20:36 ` Ray Andrews
2024-04-13 21:01 ` Bart Schaefer
2024-04-14 0:28 ` Ray Andrews
2024-04-14 0:30 ` Lawrence Velázquez
2024-04-14 3:26 ` Ray Andrews
2024-04-14 3:49 ` Lawrence Velázquez
2024-04-14 4:57 ` Bart Schaefer
2024-04-14 13:24 ` Ray Andrews
2024-04-14 13:35 ` Roman Perepelitsa
2024-04-14 14:06 ` Ray Andrews
2024-04-14 14:15 ` Roman Perepelitsa
2024-04-14 14:53 ` Ray Andrews
2024-04-14 15:11 ` Mark J. Reed
2024-04-14 16:23 ` Ray Andrews
2024-04-14 14:06 ` Mark J. Reed
2024-04-14 14:47 ` Ray Andrews
2024-04-14 14:59 ` Mark J. Reed
2024-04-14 15:51 ` Bart Schaefer
2024-04-14 17:22 ` Ray Andrews
2024-04-14 17:42 ` Mark J. Reed
2024-04-14 18:24 ` Bart Schaefer
2024-04-14 22:00 ` Ray Andrews
2024-04-13 20:11 ` Mark J. Reed
2024-04-13 20:53 ` Bart Schaefer
2024-04-14 0:19 ` Ray Andrews
2024-04-13 1:35 ` Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e893a082-4b27-4588-9062-ee83ed4ff32d@app.fastmail.com \
--to=larryv@zsh.org \
--cc=zsh-users@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).