¿Cómo reenvío parámetros a otro comando en bash script?

165

Dentro de mi script bash, me gustaría analizar cero, uno o dos parámetros (el script puede reconocerlos), luego reenviar los parámetros restantes a un comando invocado en el script. ¿Cómo puedo hacer eso?

Łukasz Lew
fuente

Respuestas:

239

Use el shiftcomando incorporado para "comer" los argumentos. Luego llame al proceso hijo y pásele el "$@"argumento para incluir todos los argumentos restantes. Observe las comillas, deben mantenerse, ya que hacen que la expansión de la lista de argumentos se cite correctamente.

relajarse
fuente
23
en realidad "$ @" es más seguro que $ *
pixelbeat
1
@pixelbeat: Gracias, buena captura. Yo edité. @ Łukasz Lew: consulte la página vinculada en el manual. :) Básicamente, maneja las citas mejor.
Descanse el
22
$@esencialmente trata cada elemento de la matriz como una cadena entre comillas: se pasan sin oportunidad de expansión. También asegura que cada uno sea visto como una palabra separada. Esta explicación junto con un script de prueba que demuestra la diferencia está aquí: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel
2
¡Presta atención al uso de citas! Lea más sobre por qué es importante para ellos aquí: stackoverflow.com/a/4824637/4575793
Cadoiz
32

bash usa el comando shift :

por ejemplo shifttest.sh:

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

shifttest.sh 1 2 3 produce

1
2 3
Steve B.
fuente
2
@ TamásZahola cuidado de explicar?
Kyle Chadha
2
Si reenvía los argumentos $1sin citarlos "$1", el shell realizará la división de palabras, por ejemplo foo bar, se reenviará como fooy por barseparado.
Tamás Zahola
Lea más sobre por qué es importante tener el doble "por aquí: stackoverflow.com/a/4824637/4575793
Cadoiz
1
Mi cerebro revolvió un par de letras en "shifttest" y, en consecuencia, lo leí como algo más.
Alex
21

Bash admite parámetros de subconjunto (consulte Subconjuntos y subcadenas ), por lo que puede elegir qué parámetros procesar / pasar de esta manera.

  1. abra un nuevo archivo y edítelo r.sh: vim :

    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. ejecutarlo:

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

    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
fuente