Passe parâmetros de linha de comando para um programa dentro do script shell


15

Quanto ./script.sh arg1 [arg2 arg3 ...], os argumentos de linha de comando arg1, arg2... pode ser obtido por $1, $2, ... Mas o número de argumentos é não fixo.

No script de shell, quero passar os argumentos a partir de arg2um programa,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

Como eu poderia fazer isso, pois poderia haver um ou mais argumentos?

Respostas:


17

A maneira usual seria salvar uma cópia de arg1 ( "$1") e alterar os parâmetros por um, para que você possa consultar a lista inteira como "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

é claro que o bash tem algum suporte a array, mas não é necessário para a pergunta como colocada.

Se mesmo o arg1 for opcional, você o verificaria assim:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

As aspas duplas são necessárias ao usar $@?
Lee

1
As aspas duplas com $@informam ao shell que aspas duplas de cada parâmetro (algo interessante a ser feito se os parâmetros contiverem caracteres interessantes, como parênteses ou asteriscos). Se você não se preocupam com isso, uma planície $*obras ...
Thomas Dickey

6
@ Lee Sim, as aspas duplas são necessárias. Caso contrário, em vez de passar pela lista de argumentos, cada argumento é dividido em espaço em branco, então cada peça é interpretada como um padrão curinga e, se o padrão corresponder, será substituído pela lista de correspondências. Em geral, sempre substituindo variáveis ​​com aspas duplas .
Gilles 'SO- stop being evil' em

10

Você pode dividir os parâmetros posicionais usando a expansão de parâmetros. A sintaxe é:

${parameter:offset:length}

Se lengthomitido, é considerado até o último valor.

Como você passou do penúltimo para o último argumento, você precisa:

${@:2}

Exemplo:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.