args() { printf '<%s> ' "$@"; echo; } set -- 1 2 3 4 5 args "${@} ${1}" args "${1} ${@}" args "${1}${@}${1}" args "${1} ${@} ${1}" args ${1}"$@"${1} args "$@"${1} args ${1}"$@" args "$@""${1}" args "${1}""$@" args "${@}foo" args ${@}${1} args ${@}foo IFS= args "$@""${1}" args "${1}""$@" args ${@}${1} args ${1}${@} args ${@}foo echo second set: IFS=$' \t\n' set -- '1 2' 3 4 5 args "${@} ${1}" args "${1} ${@}" args "${1}${@}${1}" args "${1} ${@} ${1}" args ${1}"$@"${1} args "$@"${1} args ${1}"$@" args "$@""${1}" args "${1}""$@" args "${@}foo" args ${@}${1} args ${@}foo IFS= args "$@""${1}" args "${1}""$@" args ${@}${1} args ${1}${@} args ${@}foo echo third set: IFS=$' \t\n' alias declare=typeset a(){ echo echo '"${@:2}a3 a2" a$1 #works as long as $1 and 3 are swapped' echo "${@:2}a3 a2" a$1 "${@:2}a3 a2" a$1 echo $? a=("${@}");} b(){ echo echo '"${@:2}b$1 b2" b3 #fails! why?' echo "${@:2}b$1 b2" b3 "${@:2}b$1 b2" b3 echo $? b=("${@}");} c(){ echo echo '${@:2}c$1 c2 c3 #works as long as quoting omitted' echo ${@:2}c$1 c2 c3 ${@:2}c$1 c2 c3 echo $? c=("${@}");} a x set y z;declare -p a b x set y z;declare -p b c x set y z;declare -p c