Perl

將特殊字元從 perl 腳本傳遞到 csh

  • July 27, 2017

我正在編寫一個 perl 腳本,它接受一個字元串並將其傳遞給一個 .csh 腳本。

PerlScript.pl:

$CMDLineArgs = "-stuff -more_stuff \'-even_more \"*stuff\" -last_stuff\'";
system(Script.csh $CMDLineArgs);

腳本.csh:

set flags="$argv[*]"

出於某種原因,單引號沒有進入我的 .csh 腳本,如果 * 在字元串中的任何位置,整個事情都不會起作用。關於如何將 perl 腳本中出現的字元串完全導入 csh 腳本的任何建議?

可能還有其他方法可以做到這一點(我不是 csh/tcsh 方面的專家——我在 90 年代初不得不使用 csh 時不喜歡它,並且從那時起就盡可能地避免使用它)但我唯一的方法是發現在 tcsh 中做你想做的事情是用set nonomatchor set noglob。例如:

perlscript.pl:

#!/usr/bin/perl

@CMDLineArgs = ('-stuff', '-more_stuff', '-even_more', '*stuff', '-last_stuff');
system('./script.tcsh', @CMDLineArgs);

或者,如果您不想輸入所有單引號和逗號,請使用qw()

@CMDLineArgs = qw(-stuff -more_stuff -even_more *stuff -last_stuff);

腳本.tcsh:

#!/bin/tcsh

set nonomatch
set flags=($argv[*])

foreach f ($flags)
 echo $f
end

輸出是:

$ ./perlscript.pl
-stuff
-more_stuff
-even_more
*stuff
-last_stuff

請注意,這如何將每個參數作為一個單獨的元素保存在 中$flags,而不是將它們全部連接成一個字元串。

Perl``quote為您似乎遇到的這種情況提供了各種-ing 運算符。特別是qw//qq//、 和q//運算符,分別代表quote worddouble quote stringsingle quote string運算符。您會注意到它們完全消除了引用數據的繁瑣工作。

正如已經指出的那樣,出於安全原因,使用通過 a而不是 in提供system()的參數更好地提供命令。list``scalars

最後,在cshell程式碼內部,您需要使用:q修飾符來引用變數。

%  cat PerlScript.pl

my @Args = (
  qw/     -stuff  /,                    # whitespace ignored
  qw/ -more_stuff /,                    # whitespace ignored
  q['-even more "*stuff" -last_stuff'], # whitespace IMPORTANT
);

my $csh_script = q[Script.csh];

system($csh_script, @Args) and
  die qq[Error: The script $csh_script has failed with exit code:], $? >> 8;

% cat Script.csh

foreach arg ( $argv[*]:q )
  echo "<$arg>"
end

結果

<-stuff>
<-more_stuff>
<'-even more "*stuff" -last_stuff'>

筆記

  • 如果您認為輸出不符合您的喜好,請不要更改 csh 腳本中的任何內容。而是@Args在 PerlScript.pl 文件中使用。
  • 例如,如果您要填充@Args如下所示的內容:

my @Args = (
  qw/     -stuff  /,
  qw/ -more_stuff /,
  q['-even more],
  q["*stuff"],
  q[-last_stuff'],
  #q['-even more "*stuff" -last_stuff'],
);

然後你會看到以下結果:

<-stuff>
<-more_stuff>
<'-even more>
<"*stuff">
<-last_stuff'>

引用自:https://unix.stackexchange.com/questions/382046