¿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?

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.