On Wed, Sep 18, 2024 at 08:05:10 +0300, Oğuz wrote: > On Wed, Sep 18, 2024 at 4:19 AM Steffen Nurpmeso <steffen@xxxxxxxxxx> wrote: > > > > It boils down to this: > > f(){ echo $#;}; set "" "" ""; IFS=x; f $* > > bash, NetBSD and FreeBSD sh, and ksh88 all agree and print 2. pdksh > prints 3 but mksh and oksh print 1. dash, ksh93, yash, and zsh print > 0. At the risk of sounding like a broken record, using an unquoted $* or $@ in a context where word splitting occurs is just *begging* for trouble. Please don't do this in your scripts. All of these implementation differences and possible bugs will just stop mattering, if you stop using questionable shell features. If you want to pass along your positional parameters to a function, use "$@" with quotes. This will pass each parameter as a separate argument to the function, with no modifications. It should work in every post-Bourne shell (if it doesn't, that's a bug). This is almost always what you want. If you want to join all of your positional parameters together into a single string, use "$*" with quotes. The first character of IFS will be inserted between each pair of parameters. This is sometimes useful when writing messages to log files, or to produce a simple row of delimited fields (not a full-blown CSV file, though).