# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # first, let's start with the basics recho "$@" recho "$*" recho $@ recho $* foo=$* foo=$@ foo="$*" foo="$@" unset -v bar foo=${bar:-$*} foo=${bar:-$@} foo=${bar:-"$*"} foo=${bar:-"$@"} foo=${!*} foo=${!@} 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 the effect of quoting $* and $@ in an assignment context (plus # arrays) -- bugs through bash 4.2 ${THIS_SH} ./dollar-at-star1.sub # more tests for expanding $@ and $* in a context where there is no word # splitting ${THIS_SH} ./dollar-at-star2.sub ${THIS_SH} ./dollar-at-star3.sub ${THIS_SH} ./dollar-at-star4.sub ${THIS_SH} ./dollar-at-star5.sub ${THIS_SH} ./dollar-at-star6.sub ${THIS_SH} ./dollar-at-star7.sub # tests for expansions of $@ and ${a[@]} (vs. $* and ${a[*]}) on the RHS of # assignment statements with non-default IFS: $@ expands to args or array # members separated by spaces ${THIS_SH} ./dollar-at-star8.sub # more tests of the expansions of $@ and $* (and their array equivalents) # with different values for IFS ${THIS_SH} ./dollar-at-star9.sub # tests for expansions of "$*" and "$@" and their array equivalents when $1 == '' # and we're using the POSIX word expansions ${THIS_SH} ./dollar-at-star10.sub ${THIS_SH} ./dollar-at-star11.sub # 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 # tests for expansions of "${array[*]}" and "${array[@]}" when $IFS is not the # default and the array contains null elements ${THIS_SH} ./dollar-star3.sub # test for set -u and expansions of $@ when there are no positional parameters ${THIS_SH} ./dollar-at3.sub # test for set -u and expansions of $* when there are no positional parameters ${THIS_SH} ./dollar-star4.sub # tests for expansions of $* when IFS is null ${THIS_SH} ./dollar-star5.sub # tests for inappropriate word splitting through bash-4.2 ${THIS_SH} ./dollar-at4.sub # tests for problems with "$@" preceded and followed by other quoted expansions # through bash-4.2 ${THIS_SH} ./dollar-at5.sub # tests for problems with "${@:1}" and other expansions with null entries # in positional parameters ${THIS_SH} ./dollar-at6.sub # tests for expansions of $* when $1 == ""; problem through bash-4.2 ${THIS_SH} ./dollar-star6.sub # tests for expansions of $* (unquoted) when IFS changes (e.g., ${IFS:=-}) # problem through bash-4.2 ${THIS_SH} ./dollar-star7.sub # tests for expansions of $* (unquoted) when IFS is null and word splitting is # not going to be performed. # problem through bash-4.4 in some parameter expansion contexts ${THIS_SH} ./dollar-star8.sub # tests for expansions of "$@" when there are no positional parameter or when # $1 == '' and the expansion is preceded by something that results in a quoted # null string ${THIS_SH} ./dollar-at7.sub # tests for expansions of $* when in an assignment context (no splitting) and # IFS is null ${THIS_SH} ./dollar-star9.sub # more tests for expansions of $* when not splitting with IFS set or unset and # null strings as the positional parameters ${THIS_SH} ./dollar-star10.sub exit 0