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 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.
$@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
$1sin citarlos "$1", el shell realizará la división de palabras, por ejemplo foo bar, se reenviará como fooy por barseparado.
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 10el 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