On Sat, Aug 17, 2024, at 6:41 AM, Freek de Kruijf wrote:
> Apparently I have a problem with the concept of $@

Greg has already tried explaining it, so I'll just focus on a few details:


> I see it as list of zero or more non-whitespaced elements

When used in a context where splitting is performed, "$@" expands
to *all* positional parameters, not just "non-whitespaced" ones.

When used in a context where splitting is not performed (like the
right-hand side of a simple assignment), both $@ and "$@" expand
to a single field comprising all the parameters concatenated with
spaces.  This representation doesn't really handle parameters that
are empty or that contain spaces themselves.

        $ set nospace '' 'one space'
        $ p=$@
        $ declare -p p
        declare -- p="nospace  one space"

This is not usually what you want.


> and quotes around it makes it into a single element.
> Like a parameter p with a content of zero or more non-whitespaced 
> elements, where the quotes make in into a single element.

The distinctive behavior of "$@" is documented.

https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#index-_0040
https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_05_02


> Thanks for teaching me this concept. It must have some meaning in more 
> complicated situations.

I assert the opposite sentiment.  When processing the positional
parameters, multiple-field "$@" is almost always what you want, and
any other expansion is only appropriate in very specific situations.


> A test -n "$1" has also the effect I was looking for as the suggested one
> $# -ne 0 .

These commands don't agree when $1 is set to an empty value.

        $ set ''
        $ test -n "$1"; echo "$?"
        1
        $ test "$#" -ne 0; echo "$?"
        0


-- 
vq

Reply via email to