2013-03-05 38 views
1

我有兩個腳本(一個ksh和其他Perl),一個調用另一個。如果有人不小心在文件名中輸入空白並將其報告爲錯誤(僅當文件不存在時),我必須處理場景。它看起來像p.sh使用$*傳遞/轉發所有參數到p.pl不處理引用的參數應該是他們的方式?任何想法如何解決這一問題?我們只需說一個人可以在文件名中輸入多個空格。ksh:如何在腳本之間傳遞包含空格的參數?

p.sh:

#!/usr/bin/env ksh 
/tmp/p.pl $* 1>/tmp/chk.out 2>&1 
print "Script exited with value $?" 
print "P.PL OUTPUT:" 
cat /tmp/chk.out 
exit 0 

p.pl:

#!/usr/bin/perl -w 
use Getopt::Std; 

getopts ("i:", \ %options); 

if ($options{i} && -e $options{i}) { 
    print "File $options{i} Exists!\n"; 
} 
else { 
    print "File $options{i} DOES NOT exist!\n"; 
} 

測試用例(當有實際的文件 '/ tmp目錄/一b.txt'(與在它的系統上):

[test] /tmp $ p.pl -i /tmp/a b.txt 
File /tmp/a DOES NOT exist! 
[test] /tmp $ p.pl -i "/tmp/a b.txt" 
File /tmp/a b.txt Exists! 
[test] /tmp $ ./p.sh -i "/tmp/a b.txt" 
Script exited with value 0 
P.PL Check OUTPUT: 
File /tmp/a DOES NOT exist! 
[test] /tmp $ ./p.sh -i "/tmp/ a b.txt" 
Script exited with value 0 
P.PL Check OUTPUT: 
File /tmp/ Exists! 

它是我正在嘗試修復的最後兩種情況。謝謝。

回答

1

要保留被傳遞到腳本的空白,使用[email protected]參數:

/tmp/p.pl "[email protected]" 1>/tmp/chk.out 2>&1 

引號是必要的,以確保引用的空白由p.pl看到。

+0

太好了,謝謝。即使'p.pl'接受的不止是參數('-i','-j','-k'等等),它是否也能工作? 「'」$ @「'是否將所有參數組合爲一個單引號字符串?在那種情況下,如果它也在尋找'-j',它可能會中斷'p.pl'? – 2013-03-05 20:23:19

+0

''$ @'''和'「$ *」'之間的區別在於前者給出了一個單獨引用的參數列表(認爲是「ab」「c」'),而後者給出了一個連接字符串他們都(認爲'「abc」')。因此''@ $''將會安全地保留你在命令行中提供的引用參數,像'-j'這樣的選項將保持獨立。 – chepner 2013-03-05 20:24:52

+0

驗證了你說的與實際代碼。我以爲'$ @'只是一個bash而已,因此沒有早些嘗試。感謝澄清。 – 2013-03-05 20:32:16

相關問題