2016-12-20 36 views
4

我有一個Perl腳本test.pl從讀取命令行參數參數傳遞給Perl程序不保留空間

#!/usr/bin/perl -w 
for(@ARGV) { print("$_\n") } ; 

這種運作良好,當我通過像「AB」參數「 CD的」 e在命令行上
結果是:

a b 
c d 
e 

如果我聲明變量

X='"a b" "c d" e' 

然後運行

test.pl $X 

我得到

"a 
b" 
"c 
d" 
e 

我需要運行各種shell腳本的Perl腳本作爲一個輔助功能和參數由這些腳本來計算。
參數數量不固定,所以我必須將其作爲列表傳遞。
唉,我無法找到一種方法讓perl程序根據需要處理我的參數。
我曾想過通過文件傳遞參數,但隨後從命令行手動調用perl腳本變得很笨拙。
我怎樣才能讓perl腳本保存參數中的空格?

+1

論點'perl'腳本傳遞被保存在'@'ARGV' array'所以,當你打印出來給這個數組的價值觀和打印出來給,因爲它不保護你的論點,空間之間的空間,不同的參數用於識別不同的參數。 – AbhiNickz

+0

的可能的複製[Perl腳本具有命令行參數爲空格(http://stackoverflow.com/questions/1267829/perl-script-that-has-command-line-arguments-with-spaces) – AbhiNickz

+0

傳遞參數上如上所述,命令行工作正常。不起作用的是通過變量傳遞參數。 – user333869

回答

0

感謝@All的提示。 從shell傳遞的參數似乎並不像我想象的那麼容易。 因此,我在perl程序中添加了另一個參數,它告訴它從文件而不是命令行讀取參數。 這可以像希望的那樣工作,並繞過shell解釋。

2

如果您使用bash,那麼你可以考慮使用一個array variable來保存參數,以防止信息丟失當變量代入test.pl命令調用:

declare -a X=("a b" "c d" e) 
test.pl "${X[@]}" 

如果有幫助,你可以逐個建立陣列:

X=("a b") 
X+=("c d") 
X+=("e") 
+0

陣列整齊。我學到了東西。 :) – simbabque

+0

我試圖用bash陣列,它的作品。不幸的是,我需要使用ksh來實現向後兼容,並且在那裏不起作用。所以我正在尋找一種簡單的方法來讓我的Perl程序能夠區分STDIN的輸入和STDIN的輸入,我將用它從ksh腳本中調用它,並從命令行參數輸入,然後我將用它來進行交互式調用。 – user333869

+0

您使用的是哪種版本的Korn shell?值得在這個問題上增加細節。 –

2

問題是shell。執行

./test.pl "$X" 

將給shell一個參數。一個解決辦法是使用

/bin/bash -c "./test.pl $X" 

HTH 喬治

+0

我認爲你有一個語法錯誤,難道你不是指'./test.pl「$ X」'或'/ usr/bin/perl test.pl「$ x」'。 – AbhiNickz

+0

你是絕對正確的。否則,這隻有當test.pl在PATH我猜 –