On Allow for ${@:2} syntax in variable assignment they say I should not use "${@:2}" because it breaks things across different shells, and I should use "${*:2}" instead.
But using "${*:2}" instead of "${@:2}" is nonsense because doing "${@:2}" is not equivalent to "${*:2}" as the following example:
#!/bin/bash check_args() { echo "\$#=$#" local counter=0 for var in "$@" do counter=$((counter+1)); printf "$counter. '$var', "; done printf "\\n\\n" } # setting arguments set -- "space1 notspace" "space2 notspace" "lastargument"; counter=1 echo $counter': ---------------- "$*"'; counter=$((counter+1)) check_args "$*" echo $counter': ---------------- "${*:2}"'; counter=$((counter+1)) check_args "${*:2}" echo $counter': ---------------- "${@:2}"'; counter=$((counter+1)) check_args "${@:2}" -->
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu) 1: ---------------- "$*" $#=1 1. 'space1 notspace space2 notspace lastargument', 2: ---------------- "${*:2}" $#=1 1. 'space2 notspace lastargument', 3: ---------------- "${@:2}" $#=2 1. 'space2 notspace', 2. 'lastargument', If I cannot use "${@:2}" (as they say), what is the equivalent can I use instead?
This is original question Process all arguments except the first one (in a bash script) and their only answer to keep arguments with spaces together is to use "${@:2}"