2011-03-04 29 views
5

這已經讓我堅持了幾個小時。使用bash腳本中的空格處理Perl命令行參數?

考慮在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"; 
} 

好吧,這只是輸出給腳本的命令行參數。

例如:

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

現在我想在shell中使用這個腳本:

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

我可以用雙引號包圍的話給腳本用空格一個參數腳本。我已經設置了shell腳本是這樣的:

#!/bin/bash 

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

echo "(command is $COMMAND)" 
$COMMAND 

我打電話與同PARAMS的hello.pl和轉義引號。 此腳本返回:

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

即使$ COMMAND變量相呼應的命令一模一樣,我跑在命令行Perl腳本第二時間的方式,這個時候它不希望看到蘋果餡餅一個參數。

爲什麼不呢?

回答

0

您應該嘗試eval $COMMAND而不是簡單地$COMMAND

2

的2命令行參數

"apple 
pie" 

的問題是歸因於外殼膨脹與IFS殼變量被設置爲具有一空間值。

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

您可以使用xargs的& SH -c '... ...代碼' 模仿/重新啓用普通參數解析。

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

另一種選擇可能是寫幾行C(就像在shebang.c中一樣)!

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