我正在使用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'
答案 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