Você pode usar a bashexpansão de parâmetro para especificar um intervalo, isso também funciona com parâmetros posicionais. Para $3... $nseria:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Esteja ciente de que ambos $@e $*ignore o primeiro argumento $0. Se você se pergunta qual deles usar no seu caso: é muito provável que você queira um citado $@. Não use a $*menos que você não queira explicitamente que os argumentos sejam citados individualmente.
Você pode experimentá-lo da seguinte maneira:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
Observe que no primeiro exemplo $0é preenchido o primeiro argumento, 0enquanto quando usado em um script $0é preenchido com o nome do script, como mostra o segundo exemplo. O nome do script, ébash claro, é o primeiro argumento, apenas que normalmente não é percebido como tal - o mesmo vale para um script tornado executável e chamado "diretamente". Portanto, no primeiro exemplo, temos $0= 0, $1= 1etc, enquanto no segundo é $0= script_file, $1= 0, $2= 1etc .; ${@:3}seleciona todos os argumentos que começam com $3.
Alguns exemplos adicionais para possíveis intervalos:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
Leitura adicional:
shiftabordagem tornará impossível o acesso$1e$2depois que você as mudou. No seu script que você usa$2ao lado de$variable_in_question, você precisa mudar isso ou usar a abordagem de expansão de parâmetros.