args=${*:3}aligns a list of arguments. You do not want to do this. Consider the template below:
set -- \
"first argument" \
"second argument" \
"third argument" \
"fourth argument" \
"fifth argument"
args=( "${@:2}" )
args=( "${args[@]:1:$(( ${#args[@]} - 2 ))}" )
printf '<%s>\n' "${args[@]}"
Execution of the above result gives the following result:
<third argument>
<fourth argument>
... and thus demonstrates that it stores arguments correctly together, even if they contain spaces or wildcards.
script :
printf '%q ' "${args[@]}"
..., , .