にevalingのための文字列を作成するようbash
でそれをevalingためperl
内の文字列を準備したい:それは印刷し安全な方法は、bashの
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スクリプトはいくつかの準備をする必要があります。
ことの一つは、'"'"'
と値のすべての'
(単一引用符)を置き換える、ですので、var
にdon't do this
を割り当てるとき
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'
EDIT iの値がperl
スクリプトによって生成される多くの変数を、必要bash
で
。 1つの変数については、私はできる:
var="$(my_script)"
しかし、私はbashスクリプトでは多くの変数が必要です。 Doing
var1="$(my_script some args)"
var2="$(my_script other args)"
...
var10="$(my_script bla bla)"
はかなり高価で遅いです。 (perlスクリプトは多くのことを行いますが、最も高価です - ウェブからjsonを取り出します...)したがって、呼び出しの数を1つに減らしたい - そのような必要があるのはeval
です。
';date;': var2=''"'"';date;'"'"':' # the escaping solves it
$(date) var='$(date)' # safe
なぜあなたはbashで物事をevalしたいですか? –
'bash'スクリプトに返す値を絶えず計算するのではなく、単一のPerlスクリプトを書くべきでしょう。 – chepner
@chepner - heh、true。残念ながら、bashスクリプトは私の責任ではありません。したがって、完全にperlに書き換えることはできません。 – kobame