2010-12-31 14 views
7

Necesito escribir un script bash que, entre otras cosas, debe pasar todos sus argumentos intactos a otro programa.

ejemplo Mínimo:

 
$ cat >proxy.sh 
#!/bin/bash 

./script.sh [email protected] 
^D 

$ chmod +x proxy.sh 

$ cat >script.sh 
#!/bin/bash 

echo one $1 
echo two $2 
echo three $3 
^D 

$ chmod +x script.sh 

Este enfoque ingenuo no funciona para argumentos con espacios:

 
$ ./proxy.sh "a b" c 
one a 
two b 
three c 

esperado:

 
$ ./proxy.sh "a b" c 
one a b 
two c 
three 

¿Qué debo escribir en proxy.sh para que esto ¿ocurrir?

Tenga en cuenta que no puedo usar alias, proxy.sh debe ser una secuencia de comandos, hace algunas cosas antes de invocar script.sh.

+1

"... debería intactos todos sus argumentos a otro programa." - ¿Es eso un error tipográfico? ¿Qué quisiste decir? – Mehrdad

+0

"... debería * pasar * todos sus argumentos ..." Reparado, lo siento. –

Respuesta

11

Cita [email protected], por lo que es "[email protected]":

$ cat >proxy.sh 
#!/bin/bash 

./script.sh "[email protected]" 
^D 

Entonces conserva las cotizaciones originales:

one a b 
two c 
three 
+0

Funciona, gracias. No esperaba eso, pensé que esto pegaría todos los argumentos a uno ... Necesito leer sobre la sintaxis de Bash, supongo. –

+5

Esto es correcto. '$ @' siempre se debe citar, o bien no hace lo que se desea (en su lugar, hace lo mismo que '$ *', que generalmente es un error). – psmears

+3

También debe adjuntar todas las demás variables en "comillas dobles" si desea mantener los espacios en ellas. Excepto en unos pocos casos excepcionales, siempre escriba '" $ var "' en lugar de '$ var'. –