1

我有两个脚本(一个 ksh 和另一个 Perl),一个调用另一个。当有人不小心在文件名中输入空格并将其报告为错误时(仅当文件不存在时),我必须处理这种情况。看起来用于$*将所有参数传递/转发给 p.pl 的 p.sh 没有按应有的方式处理带引号的参数?任何想法如何解决这一问题?假设一个人也可以在文件名中输入多个空格。

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/a 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!

这是我试图修复的最后两个场景。谢谢你。

4

1 回答 1

1

要保留传递到脚本中的空格,请使用以下$@参数:

/tmp/p.pl "$@" 1>/tmp/chk.out 2>&1

引号是必要的,以确保引用的空格被p.pl.

于 2013-03-05T20:14:14.010 回答