ksh:如何在脚本之间传递包含空格的参数?

时间:2013-03-05 20:12:17

标签: shell ksh

我有两个脚本(一个ksh和其他Perl),另一个调用另一个脚本。当有人意外地在文件名中输入空格并将其报告为错误时(仅当文件不存在时),我必须处理这种情况。它看起来像p.sh使用$*传递/转发所有参数到p.pl并不像它们应该的那样处理引用的参数?任何想法如何解决这一问题?我们只想说文件名中也可以输入多个空格。

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!

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

1 个答案:

答案 0 :(得分:1)

要保留传递给脚本的空格,请使用$@参数:

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

引号必须确保p.pl看到引用的空格。