2011-03-04 28 views
5

To doprowadzało mnie do szału już od wielu godzin.Obsługa argumentów wiersza poleceń Perl ze spacjami ze skryptu bash?

Rozważmy następujący scenariusz testowy w Perlu: (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, to po prostu wypisuje argumenty wiersza poleceń podanych do skryptu.

Na przykład:

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

mogę dać skrypt jeden argument z przestrzeni przez otaczający słowa z cudzysłowach:

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

Teraz chcę użyć tego skryptu w powłoce scenariusz. Skonfigurowałem skrypt powłoki w następujący sposób:

#!/bin/bash 

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

echo "(command is $COMMAND)" 
$COMMAND 

Witam hello.pl z tymi samymi parami i wyciętymi cytatami. Ten skrypt zwraca:

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

Nawet jeśli zmienna $ POLECENIE echa polecenia dokładnie tak jak na drodze wpadłem skrypt perla z linii poleceń po raz drugi, tym razem nie chce zobaczyć szarlotkę jako pojedynczy argument.

Dlaczego nie?

Odpowiedz

0

Powinieneś spróbować eval $COMMAND zamiast po prostu $COMMAND.

2

Emisja 2 argumentów polecenia linii

"apple 
pie" 

ze względu na rozszerzenie powłoki z IFS powłoki zmienna ustawiany mieć miejsce w postaci wartości.

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

Można użyć xargs & sh -c '... kod ...' naśladować/ponownie włączyć zwykły parametru analizowania.

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

Inną opcją może być napisanie kilku linii C (jak w shebang.c)!

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

Powiązane problemy