想在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