Como encaminhar parâmetros para outro comando no script bash?

165

Dentro do meu script bash, eu gostaria de analisar zero, um ou dois parâmetros (o script pode reconhecê-los) e depois encaminhar os parâmetros restantes para um comando chamado no script. Como eu posso fazer isso?

Łukasz Lew
fonte

Respostas:

239

Use o shiftcomando interno para "comer" os argumentos. Em seguida, chame o processo filho e passe o "$@"argumento para incluir todos os argumentos restantes. Observe as aspas, elas devem ser mantidas, pois fazem com que a expansão da lista de argumentos seja citada corretamente.

descontrair
fonte
23
realmente "$ @" é mais seguro do que $ *
pixelbeat
1
@pixelbeat: Obrigado, boa captura. Eu editei. @ Łukasz Lew: veja a página vinculada ao manual. :) Basicamente, ele lida melhor com as citações.
descontrair
22
$@trata essencialmente cada elemento da matriz como uma sequência de caracteres citada - eles são transmitidos sem oportunidade de expansão. Também garante que cada um seja visto como uma palavra separada. Esta explicação junto com um script de teste demonstrando a diferença está aqui: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel
2
Preste atenção para usar aspas! Leia mais sobre por que é importante eles por aqui: stackoverflow.com/a/4824637/4575793 #
Cadoiz
32

O bash usa o comando shift :

por exemplo shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 produz

1
2 3
Steve B.
fonte
2
@ TamásZahola gostaria de explicar?
Kyle Chadha
2
Se você encaminhar os argumentos $1sem citá-los como "$1", o shell executará a divisão de palavras, portanto, por exemplo foo bar, será encaminhado como fooe barseparadamente.
Tamás Zahola 17/07/2018
Leia mais sobre por que é importante ter o dobro "por aqui: stackoverflow.com/a/4824637/4575793
Cadoiz
1
Meu cérebro confundiu algumas letras no "teste de turno" e, consequentemente, li como outra coisa.
Alex
21

O Bash suporta parâmetros de subconjunto (consulte Subconjuntos e substrings ), para que você possa escolher quais parâmetros processar / passar assim.

  1. abra um novo arquivo e edite-o: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. executá-lo:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. o resultado é:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
Robert Lujo
fonte