On Sat, Aug 17, 2024 at 12:41:45 +0200, Freek de Kruijf wrote: > Apparently I have a problem with the concept of $@, I see it as list of zero > or more non-whitespaced elements, 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. > > Thanks for teaching me this concept. It must have some meaning in more > complicated situations.
In a nutshell: "$*" All of the parameters joined together with spaces between them. "$@" All of the parameters expanded as a list of zero or more words. $* Usually a bug. $@ Usually a bug. The unquoted forms undergo THREE rounds of expansion. First, each parameter is expanded as a separate word, like "$@" does. Then, each of those words undergoes word splitting using IFS, to generate a second list of words. Finally, each of those words undergoes filename expansion (globbing) to generate a third list of words. The final result is that third list. You almost never want that. Here's an illustration of how they work: hobbit:~$ set -- "a b" "" "files matching foo.p*" hobbit:~$ printf '<%s> ' "$*" ; echo <a b files matching foo.p*> hobbit:~$ printf '<%s> ' "$@" ; echo <a b> <> <files matching foo.p*> hobbit:~$ printf '<%s> ' $* ; echo <a> <b> <files> <matching> <foo.pdf> <foo.pl> <foo.png> hobbit:~$ printf '<%s> ' $@ ; echo <a> <b> <files> <matching> <foo.pdf> <foo.pl> <foo.png> As documented, "$*" gives one big string, "$@" gives a list of strings, and the unquoted forms give... that.