# 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 exit 0