Perl使用各种不同的引号正确地转义字符串
我正在用Perl编写一个脚本,我有一个如下所示的散列Perl使用各种不同的引号正确地转义字符串,perl,Perl,我正在用Perl编写一个脚本,我有一个如下所示的散列 my %hash = ( "ITEM" => { "cmd" => "find / \( -wholename '/home/homedir/*' -prune -o -wholename '/proc/*' -prune \) -o \( -type f -perm -0002 \) -exec ls -l '{}' ';' 2>/dev/null", }, )) 现在,我使用的命令使用各
my %hash = (
"ITEM" => {
"cmd" => "find / \( -wholename '/home/homedir/*' -prune -o -wholename '/proc/*' -prune \) -o \( -type f -perm -0002 \) -exec ls -l '{}' ';' 2>/dev/null",
},
))
现在,我使用的命令使用各种不同的引号。比如说
find / \( -wholename '/home/homedir/*' -prune -o -wholename '/proc/*' -prune \) -o \( -type f -perm -0002 \) -exec ls -l '{}' ';' 2>/dev/null
当我运行perl脚本时,像这样的复杂命令将不会运行,并抛出错误,如
perl -e '$cmd=`find / \( -wholename '/home/homedir/*' -prune \) -o \( -type d -perm -0002 \) -exec ls -ld '{}' ';' 2>/dev/null | grep root` ; print $cmd'
在-e第1行的EOF之前的任何位置都找不到字符串终止符“`”
或者一些语法错误基命令。我猜这与Perl处理带引号字符串的方式有关
如何使用尽可能少的转义字符正确引用此字符串。换句话说。我应该如何引用此字符串,以便像上面那样编写哈希,并且不会因为不同的引号而出现语法错误?您不能单独使用单引号。您需要使用
'\''
正确地转义它们:
一些替代版本:
使用双引号而不是单引号作为perl-e
的限制器:
perl -e "$cmd=`find / \( -wholename '/home/homedir/*' -prune \) -o \( -type d -perm -0002 \) -exec ls -ld '{}' ';' 2>/dev/null | grep root` ; print $cmd"
当您想要使用上一个版本时,您需要使用q{}
,qq{}
带引号的字符串修改哈希:
my %hash = (
"ITEM" => {
"cmd" => q{find / \( -wholename '/home/homedir/*' -prune -o -wholename '/proc/*' -prune \) -o \( -type f -perm -0002 \) -exec ls -l '{}' ';' 2>/dev/null},
},
);
其中,q{}
是单引号,qq{}
是双引号
编辑:你也可以看看 您需要在shell级别转义单引号 为了演示,以下内容相当于打印“'\n”代码>从命令行:
perl -e 'print "'\''\n"'
产出:
'
因此,您需要将命令中的任何'
转换为'\'
。您可以使用来避免调用带有所有这些讨厌的嵌套引号的shell。
'