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!
它是我正在嘗試修復的最後兩種情況。謝謝。
太好了,謝謝。即使'p.pl'接受的不止是參數('-i','-j','-k'等等),它是否也能工作? 「'」$ @「'是否將所有參數組合爲一個單引號字符串?在那種情況下,如果它也在尋找'-j',它可能會中斷'p.pl'? – 2013-03-05 20:23:19
''$ @'''和'「$ *」'之間的區別在於前者給出了一個單獨引用的參數列表(認爲是「ab」「c」'),而後者給出了一個連接字符串他們都(認爲'「abc」')。因此''@ $''將會安全地保留你在命令行中提供的引用參數,像'-j'這樣的選項將保持獨立。 – chepner 2013-03-05 20:24:52
驗證了你說的與實際代碼。我以爲'$ @'只是一個bash而已,因此沒有早些嘗試。感謝澄清。 – 2013-03-05 20:32:16