在tcsh中的shell片段中有三个括号/引号级别?

时间:2013-12-03 02:12:55

标签: perl sh quotes tcsh

我正在使用tcsh;我想在命令行上运行一些sh片段,它本身包含一个perl片段,其中包含一些要打印的字符串。

这导致三个级别的括号,但只有两个可用 - “和'。

有办法吗?

tcsh# sh -c 'while (true); do mtr --order "SRL BGAWV M" …; hping --icmp-ts --count 12 … | perl -ne '... if (/tsrtt=(\d+)/) {print $0,"\t"…}' ; done'

3 个答案:

答案 0 :(得分:1)

q/../用于单引号,将qq/.../用于Perl代码中的双引号。

例如,print $0, qq/\t/

答案 1 :(得分:1)

要在单引号中包含单引号,请使用'\''。 e.g。

perl -ne'... print $0, "\t" ...'

变为

sh -c '... | perl -ne'\''... print $0, "\t" ...'\'''

在这种特殊情况下,替代方案是替换

perl -ne'... print $0, "\t" ...'

perl -ne"... print \$0, qq{\t} ..."

所以你得到了

sh -c '... | perl -ne"... print \$0, qq{\t} ..."'

我只是在Perl中编写完整的东西

perl -e'
    while (1) {
       system("mtr", "--order", "SRL BGAWV M");

       open(my $pipe, "-|", "hping", "--icmp-ts", "--count", "12");
       while (<$pipe>) {
          ...
       }
    }
'

答案 2 :(得分:0)

另一个解决方案是使用一些参数进行大而长的echo,所有参数都使用'进行转义,其中实际文字'是从执行{{1}的结果中收集的将整个printf "'"传递给echo,而不是将字符串作为参数直接传递给sh。

这实际上看起来有点容易,因为它基本上不涉及转义整个perl片段,而只是转义用于sh的两个'

tcsh#echo'while(true); do mtr --order“SRL BGAWV M”......; hping --icmp-ts --count 12 ... | perl -ne'`printf“'”`'... if(/ tsrtt =(\ d +)/){print $ 0,“\ t”...}'`printf“'”`';完成'| SH