2011-03-04 14 views
5

Questo mi sta facendo impazzire da ore ormai.Gestione degli argomenti della riga di comando Perl con spazi da uno script bash?

Si consideri il seguente script di prova in Perl: (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, stampa semplicemente gli argomenti della riga di comando dato allo script.

Per esempio:

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

posso dare il copione di un singolo argomento con uno spazio circondando le parole con le virgolette:

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

Ora voglio utilizzare questo script in un guscio script. Ho installato lo script di shell in questo modo:

#!/bin/bash 

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

echo "(command is $COMMAND)" 
$COMMAND 

sto chiamando il hello.pl con gli stessi params e scappai citazioni. Questo script restituisce:

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

Anche se la variabile $ COMANDO fa eco il comando esattamente come il modo in cui mi sono imbattuto lo script Perl dalla linea di comando per la seconda volta, questa volta non vuole vedere la torta di mele come un singolo argomento.

Perché no?

risposta

0

Si consiglia di provare eval $COMMAND anziché semplicemente $COMMAND.

2

L'emissione dei 2 argomenti della riga di comando

"apple 
pie" 

è dovuto a guscio di espansione con i IFS shell variabile essendo impostato per avere uno spazio come valore.

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

È possibile utilizzare xargs & sh -c '... code ...' per simulare/riattivare ordinaria dei parametri di analisi.

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

Un'altra opzione potrebbe essere quella di scrivere alcune righe di C (come in shebang.c)!

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

Problemi correlati