Processar todos os argumentos, exceto o primeiro (em um script bash)

Eu tenho um script simples, onde o primeiro argumento é reservado para o nome do arquivo, e todos os outros argumentos opcionais devem ser passados ​​para outras partes do script.

Usando o Google eu encontrei este wiki , mas forneceu um exemplo literal:

echo "${@: -1}" 

Não consigo mais nada para funcionar, como:

 echo "${@:2}" 

ou

 echo "${@:2,1}" 

Eu recebo “substituição ruim” do terminal.

Qual é o problema, e como posso processar todos, mas o primeiro argumento passado para um script bash?

Usa isto:

 echo "${@:2}" 

A seguinte syntax:

 echo "${*:2}" 

também funcionaria, mas não é recomendado, porque como @Gordon já explicou, que usando * , ele executa todos os argumentos juntos como um único argumento com espaços, enquanto @ preserva os intervalos entre eles (mesmo que alguns dos argumentos sejam eles próprios contém espaços). Não faz a diferença com o echo , mas é importante para muitos outros comandos.

Se você quiser uma solução que também funcione em /bin/sh tente

 first_arg="$1" shift echo First argument: "$first_arg" echo Remaining arguments: "$@" 

shift [n] muda os parâmetros posicionais n vezes. Uma shift define o valor de $1 para o valor de $2 , o valor de $2 para o valor de $3 e assim por diante, diminuindo o valor de $# em um.

http://wiki.bash-hackers.org/scripting/posparams

Ele explica o uso de shift (se você quiser descartar os primeiros N parâmetros) e, em seguida, implementar o Mass Usage (procure o título com esse título).