想在perl
准备字符串在bash
evaling它像:安全的方式来创建字符串在bash evaling
str="$(perl -E '$sq=chr(047);say qq{var1=${sq}hello world${sq}}')" #this just for demo - the real perl scirpt is ofcourse real complex script ...
echo "got for eval: [[$str]]"
eval "$str"
echo "var1 : [[$var1]]"
它打印:
got for eval: [[var1='hello world']]
var1 : [[hello world]]
或课程的eval
是危险的,所以perl脚本需要做一些准备。
的一件事是,在与'"'"'
值替换所有'
(单引号),这样的分配don't do this
到var
时,应打印为
var='don'"'"'t do this' #safe for eval.
这里有一些更considartions我应该遵循用于准备变量assingnment的Perl脚本(var='some content'
)字符串安全eval
?从我的真实脚本
片段:
#!/usr/bin/env perl
use strict;
use warnings;
sub make_var {
my($name, $value) = @_;
die "Wrong variable name [$name]" if $name =~ /\W/;
my $sval = sanitise($value);
#warn qq{$name='$sval'\n};
print qq{$name='$sval'\n};
}
sub sanitise {
my $str = shift;
$str =~ s/'/'"'"'/gs;
# what more i should do here?
return $str;
}
#usage
make_var('var1', q{some
multiline
value
where i should'nt miss
escape the single quotes});
打印字符串安全的EVAL。
var1='some
multiline
value
where i should'"'"'nt miss
escape the single quotes'
编辑:理由背后:
在bash
,我需要很多变量,它由perl
脚本生成的值。对于一个变量,我可以这样做:
var="$(my_script)"
但我需要在bash脚本中有很多变量。做
var1="$(my_script some args)"
var2="$(my_script other args)"
...
var10="$(my_script bla bla)"
是相当昂贵和缓慢。 (perl脚本做了很多事情,最昂贵的是 - 它从网上获取json ...)因此,想要将呼叫数量减少到一个 - 例如需要eval
。
索姆werid模式进入我的脑海:
';date;': var2=''"'"';date;'"'"':' # the escaping solves it
$(date) var='$(date)' # safe
为什么你想EVAL在bash的东西呢? –
您应该编写一个Perl脚本,而不是不断计算值以返回到'bash'脚本。 – chepner
@chepner - 嘿,真的。不幸的是,bash脚本不是我的责任。所以,不能将它彻底改写成perl。 – kobame