All shells tested do the same for the (quoted) pair $* and $@ with this code:c='set a b @ c; IFS=:,@ ; a=$(printf <%s>  $*); b=$(printf <%s>  $@); printf %-20s and %-20s\n $a $b'd=(sh ash dash attsh ksh lksh mksh bash b44sh y2sh zsh zsh4 zsh -y)for shell in ${d[@]}; do    printf '%15s: ' $shell    $shell -c $cdoneResults:         sh: <a:b:@:c>            and <a> <b> <@> <c>             ash: <a:b:@:c>            and <a> <b> <@> <c>            dash: <a:b:@:c>            and <a> <b> <@> <c>           attsh: <a:b:@:c>            and <a> <b> <@> <c>             ksh: <a:b:@:c>            and <a> <b> <@> <c>            lksh: <a:b:@:c>            and <a> <b> <@> <c>            mksh: <a:b:@:c>            and <a> <b> <@> <c>            bash: <a:b:@:c>            and <a> <b> <@> <c>           b44sh: <a:b:@:c>            and <a> <b> <@> <c>            y2sh: <a:b:@:c>            and <a> <b> <@> <c>             zsh: <a:b:@:c>            and <a> <b> <@> <c>            zsh4: <a:b:@:c>            and <a> <b> <@> <c>          zsh -y: <a:b:@:c>            and <a> <b> <@> <c> However, for the unquoted $* and $@ the tests (only $c needs to change):c='set a b @ c; IFS=:,@ ; a=$(printf <%s>  $*); b=$(printf <%s>  $@); printf %-20s and %-20s\n $a $b'The result is:         sh: <a> <b> <> <> <c>    and <a> <b> <> <> <c>           ash: <a> <b> <> <> <c>    and <a> <b> <> <> <c>          dash: <a> <b> <> <> <c>    and <a> <b> <> <> <c>         attsh: <a> <b> <> <c>       and <a> <b> <> <c>              ksh: <a> <b> <> <c>       and <a> <b> <> <c>             lksh: <a> <b> <> <> <c>    and <a> <b> <> <> <c>          mksh: <a> <b> <> <> <c>    and <a> <b> <> <> <c>          bash: <a> <b> <> <> <c>    and <a> <b> <> <> <c>         b44sh: <a> <b> <> <> <c>    and <a> <b> <> <> <c>          y2sh: <a> <b> <> <> <c>    and <a> <b> <> <> <c>           zsh: <a> <b> <@> <c>      and <a> <b> <@> <c>            zsh4: <a> <b> <@> <c>      and <a> <b> <@> <c>        zsh -y: <a> <b> <> <> <c>    and <a> <b> <@> <c>  Leaving aside the removal of repeated values in ksh, all shells act in the same way except for zsh. Which presents a @. This may be reasonable if the idea that variables are quoted by default (or no spliting is performed by default).But in trying to get the default of all other shells and ask zsh to split (unquote) variables used, we get diferent values for $* and $@Changing again $c to:c='set a b @ c; IFS=:,@ ; a=$(printf <%s>  $*); b=$(printf <%s>  $@); [ $a = $b ] && echo Yes || echo Nope'we get this clear results:         sh: Yes        ash: Yes       dash: Yes      attsh: Yes        ksh: Yes       lksh: Yes       mksh: Yes       bash: Yes      b44sh: Yes       y2sh: Yes        zsh: Yes       zsh4: Yes     zsh -y: NopeOnly zsh fails to have unquoted (split) $* and $@ equal.
zsh fail to keep unquoted `$*` and `$@` equal
shell;zsh;quoting