1

2 つのスクリプト (1 つは ksh、もう 1 つは 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!

これは、私が修正しようとしている最後の 2 つのシナリオです。ありがとうございました。

4

1 に答える 1

1

スクリプトに渡された空白を保持するには、次の$@パラメーターを使用します。

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

引用符は、引用符で囲まれた空白が に表示されるようにするために必要p.plです。

于 2013-03-05T20:14:14.010 に答える