Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl使用各种不同的引号正确地转义字符串_Perl - Fatal编程技术网

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", }, )) 现在,我使用的命令使用各

我正在用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",
    },
))

现在,我使用的命令使用各种不同的引号。比如说

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。
'