Вы можете использовать вариант нарезки массива, чтобы сделать это:
args1to3="${*:1:3}" # Three arguments starting from $1
args4on="${*:4}" # The arguments starting from $4
Кстати, это может быть не то, что вы хотите, потому что он просто склеивает аргументы вместе с пробелами между ними; если какой-либо из аргументов также содержит пробелы, он потеряет счет того, какие пробелы были внутри аргументов, а какие были между ними (см. BashFAQ # 50). Если вы хотите иметь возможность хранить их прямо, используйте вместо этого массив:
args1to3=("${@:1:3}") # Three arguments starting from $1, as an array
args4on=("${@:4}") # The arguments starting from $4, as an array
othercmd "${args1to3[@]}" # Pass the first 3 arguments intact
for somearg in "${args4on[@]}"; do # Process args 4 on, one at a time
othercmd2 "$somearg"
done