Perl正确地使用各种不同的引号转义字符串

时间:2014-06-04 20:07:43

标签: perl

我在Perl中编写一个脚本,我有一个Hash of Hash看起来像这样

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'

无法找到字符串终结符"`" EOF之前的任何地方-e第1行。

或者一些语法错误基础命令。我猜它与Perl处理引用字符串的方式有关。

如何使用尽可能少的转义字符正确引用此字符串。换一种说法。我应该如何引用这个字符串,以便我可以像上面那样编写Hash,并且由于引号不同而没有语法错误?

2 个答案:

答案 0 :(得分:0)

您不能单独使用单引号。您需要使用'\''正确地转义它们:

perl -e '$cmd=`find / \( -wholename \'/home/homedir/*\' -prune \) -o \( -type d -perm -0002 \) -exec ls -ld \'{}\' \';\' 2>/dev/null | grep root` ; print $cmd'

一些替代版本:

使用双引号而不是单引号作为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{}为双引号。

编辑:你也可以看一下String::ShellQuote

答案 1 :(得分:0)

您需要在shell级别转义单引号。

为了演示,以下内容相当于命令行中的print "'\n";

perl -e 'print "'\''\n"'

输出:

'

因此,您需要在命令中将'翻译为'\''