Você pode usar bash
Parameter Expansion para especificar um faixa, isso também funciona com os parâmetros posicionais. Para $3
… $n
, seria:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Esteja ciente de que $@
e $*
ignoram o primeiro argumento $0
. Se você quer saber qual deles usar no seu caso: é muito provavelmente que você queira uma cotação $@
. Não use $*
, a menos que você explicitamente não queira que os argumentos sejam citados individualmente.
Você pode experimentar da seguinte forma:
$ 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
No primeiro exemplo, $0
é preenchido com o primeiro argumento 0
, enquanto, quando usado em um script, $0
é preenchido com o nome do script, como mostra o segundo exemplo. O nome do script para bash
, claro, é o primeiro argumento, só que normalmente não é percebido como tal - o mesmo vale para um script feito executável e chamado "diretamente". Portanto, no primeiro exemplo, temos $0
= 0
, $1
= 1
etc., enquanto na segunda é $0
= script_file
, $1
= 0
, $2
= 1
etc .; ${@:3}
seleciona todos os argumentos que começam com $3
.
Alguns exemplos adicionais para intervalos possíveis:
# 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:
-
man bash
/ EXPANSION / Expansão de parâmetro - bash-hackers.org: Como lidar com parâmetros posicionais
- Guia avançado de script basculante do TLDP: substituição de parâmetros