我在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,并且由于引号不同而没有语法错误?
答案 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"'
输出:
'
因此,您需要在命令中将'
翻译为'\''
。