# check saving and restoring positional parameters around function calls f() { echo $FUNCNAME: "$@" } f1() { f {1..50} echo $FUNCNAME: after: $@ } set -- {1..100} f1 {1..20} echo done: $@ f3() { echo $FUNCNAME:$1 shift if [ $# -le 0 ]; then return fi f3 "$@" } f3 {1..20} # now let's try source with and without positional parameters set -- {1..20} echo before source: "$@" . ./varenv15.in echo after source 1: "$@" . ./varenv15.in one two three four five six seven eight nine ten echo after source 2: "$@"