2011-03-04 12 views
5

Esto me ha estado volviendo loco durante horas.Manejando argumentos de línea de comando de Perl con espacios de un script bash?

Considérese el siguiente script en perl prueba: (hello.pl)

#!/usr/bin/perl 
print "----------------------------------\n"; 
$numArgs = $#ARGV + 1; 
print "thanks, you gave me $numArgs command-line arguments:\n"; 

foreach $argnum (0 .. $#ARGV) { 
    print "$ARGV[$argnum]\n"; 
} 

Ok, es simplemente imprime los argumentos de línea de comandos dados a la secuencia de comandos.

Por ejemplo:

$ ./hello.pl apple pie 
---------------------------------- 
thanks, you gave me 2 command-line arguments: 
apple 
pie 

que puedo dar el guión un solo argumento con un espacio que rodea las palabras con comillas dobles:

$ ./hello.pl "apple pie" 
---------------------------------- 
thanks, you gave me 1 command-line arguments: 
apple pie 

ahora quiero utilizar esta secuencia de comandos en un shell guión. He configurado el script de shell como esto:

#!/bin/bash 

PARAM="apple pie" 
COMMAND="./hello.pl \"$PARAM\"" 

echo "(command is $COMMAND)" 
$COMMAND 

Estoy llamando a la hello.pl con los mismos parametros y escapé comillas. Este script devuelve:

$ ./test.sh 
(command is ./hello.pl "apple pie") 
---------------------------------- 
thanks, you gave me 2 command-line arguments: 
"apple 
pie" 

A pesar de que la variable $ COMANDO se hace eco del comando exactamente igual que la forma me encontré con el script de perl desde la línea de comandos la segunda vez, esta vez no quiere ver el pastel de manzana como un solo argumento

¿Por qué no?

Respuesta

0

Debe intentar eval $COMMAND en lugar de simplemente $COMMAND.

2

La cuestión de los 2 argumentos de línea de comando

"apple 
pie" 

es debido a la cabeza de expansión con los IFS shell variable que se fija para tener un espacio como valor.

printf '%q\n' "$IFS" # show value of IFS variable 

Es posible utilizar xargs & sh -c '... código ...' para imitar/vuelva a activar el parámetro de análisis ordinario.

PARAM="'apple pie'" 
printf '%s' "$PARAM" | xargs sh -c './hello.pl "[email protected]"' argv0 

Otra opción es escribir algunas líneas de C (como en shebang.c)!

http://www.semicomplete.com/blog/geekery/shebang-fix.html

Cuestiones relacionadas