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?
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:
Use el shift
comando 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.
$@
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
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
$1
sin citarlos "$1"
, el shell realizará la división de palabras, por ejemplo foo bar
, se reenviará como foo
y por bar
separado.
Bash admite parámetros de subconjunto (consulte Subconjuntos y subcadenas ), por lo que puede elegir qué parámetros procesar / pasar de esta manera.
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}"
ejecutarlo:
$ chmod u+x r.sh
$ ./r.sh 1 2 3 4 5 6 7 8 9 10
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