# first, let's start with the basics recho "\$@" recho "\$*" recho \$@ recho \$* set a b recho "\$*" # If IFS is null, the parameters are joined without separators IFS='' recho "\$*" # If IFS is unset, the parameters are separated by spaces unset IFS recho "\${*}" recho "\$@" recho \$@ IFS='/' set bob 'tom dick harry' joe set \$* recho \$# recho \$1 recho \$2 recho \$3 set bob 'tom dick harry' joe set \${*} recho \$# recho \$1 recho \$2 recho \$3 set bob 'tom dick harry' joe set \$@ recho \$# recho \$1 recho \$2 recho \$3 set bob 'tom dick harry' joe set \${@} recho \$# recho \$1 recho \$2 recho \$3 # according to POSIX.2, unquoted \$* should expand to multiple words if # \$IFS is null, just like unquoted \$@ IFS='' set bob 'tom dick harry' joe set \$* recho \$# recho \$1 recho \$2 recho \$3 set bob 'tom dick harry' joe set \$@ recho \$# recho \$1 recho \$2 recho \$3 # if IFS is unset, the individual positional parameters are split on # " \t\n" if \$* or \$@ are unquoted unset IFS set bob 'tom dick harry' joe set \$* recho \$# recho \$1 recho \$2 recho \$3 set bob 'tom dick harry' joe set \$@ recho \$# recho \$1 recho \$2 recho \$3 # but not for "\$@" or "\$*" set bob 'tom dick harry' joe set "\$*" recho \$# recho \$1 recho \$2 recho \$3 set bob 'tom dick harry' joe set "\$@" recho \$# recho \$1 recho \$2 recho \$3 # POSIX.2 says these should both expand the positional parameters # to multiple words set a b c d e IFS="" recho \$@ recho "\$@" # this example is straight from the POSIX.2 rationale set foo bar bam recho "\$@" recho "\$*" unset IFS recho "\$@" recho \$@ recho "\$*" IFS=: # special variables set -- 1 2 3 4 5 6 7 8 9 10 bar=\${*} foo=\$* echo foo = "\$foo" echo bar = "\$bar" foo1=\$@ bar1=\${@} echo foo1 = "\$foo1" echo bar1 = "\$bar1" foo2="\$*" bar2="\${*}" echo foo2 = "\$foo2" echo bar2 = "\$bar2" eval foo3='\$*' bar3='\${*}' echo foo3 = "\$foo3" echo bar3 = "\$bar3" case \$* in *\:*) echo ok 1;; *) echo bad 1;; esac case \$@ in *\:*) echo bad 2;; *) echo ok 2;; esac case "\$*" in *\:*) echo ok 3;; *) echo bad 3;; esac case "\$@" in *\:*) echo bad 4;; *) echo ok 4;; esac IFS=\$' \t\n' bar=\${*} foo=\$* echo foo = "\$foo" echo bar = "\$bar" foo1=\$@ bar1=\${@} echo foo1 = "\$foo1" echo bar1 = "\$bar1" foo2="\$*" bar2="\${*}" echo foo2 = "\$foo2" echo bar2 = "\$bar2" eval foo3='\$*' bar3='\${*}' echo foo3 = "\$foo3" echo bar3 = "\$bar3" case \$* in *\ *) echo ok 1;; *) echo bad 1;; esac case \$@ in *\ *) echo ok 2;; *) echo bad 2;; esac case "\$*" in *\ *) echo ok 3;; *) echo bad 3;; esac case "\$@" in *\ *) echo ok 4;; *) echo bad 4;; esac # tests for special expansion of "\$*" and "\${array[*]}" when used with other # expansions -- bugs through bash-2.05b \${THIS_SH} ./dollar-star1.sub # tests for expansion of "\$@" on rhs of things like \${param:+word}. Bugs # though bash-2.05b \${THIS_SH} ./dollar-at1.sub # tests for expansion of other variables in double-quoted strings containing # \$@. Bugs through bash-2.05b \${THIS_SH} ./dollar-at2.sub # tests for various expansions of \$* in different contexts -- word split, # no splitting, etc. when \$IFS is NUL \${THIS_SH} ./dollar-star2.sub exit 0