Bash 如何让命令行Perl接受shell变量?
我能像你一样做数学Bash 如何让命令行Perl接受shell变量?,bash,perl,Bash,Perl,我能像你一样做数学 perl -e 'print 5253413/39151' -l 但我不太明白如何利用Perl的能力,用我自己预定义的bash变量进行数学运算。我试过了 var1=$(some wc command that yields a number); var1=$(some wc that yields another number) perl -e 'print var1/var2' -l 但是它不起作用主要有两种方法 在Perl代码中,可以使用%ENV内置哈希访问从she
perl -e 'print 5253413/39151' -l
但我不太明白如何利用Perl的能力,用我自己预定义的bash变量进行数学运算。我试过了
var1=$(some wc command that yields a number); var1=$(some wc that yields another number)
perl -e 'print var1/var2' -l
但是它不起作用主要有两种方法
- 在Perl代码中,可以使用
内置哈希访问从shell导出的环境变量%ENV
$ export var1=5253413 $ export var2=39151 $ perl -E 'say $ENV{var1}/$ENV{var2}' 134.183366963807
- 可以使用shell插值工具将shell变量的值插入到命令中
最好将其作为perl one liner的参数,而不是将值直接引入代码中
$ var1=5253413 $ var2=39151 $ perl -E '($v1, $v2) = @ARGV; say $v1/$v2' $var1 $var2 134.183366963807
sh$ export VAR1=1000
sh$ export VAR2=33
sh$ perl -MEnv -E 'say $VAR1/$VAR2' # imports all environ vars
333.333333333333
sh$ perl -MEnv=VAR1,VAR2 -E 'say $VAR1/$VAR2' # imports only VAR1, VAR2
333.333333333333
请注意,变量需要存在于perl进程继承的环境中,例如使用如上所述,或者显式地存在于单个命令中(例如通过FOO=hello perl-MEnv-E'say$FOO'
)
第二种更为晦涩的方法是使用perl从命令行设置任意变量:
sh$ VAR1=1000
sh$ VAR2=33
sh$ perl -s -E 'say $dividend/$divisor' -- -dividend=$VAR1 -divisor=$VAR2
333.333333333333
awk与its做了类似的事情。+1;还值得一提的是为命令定义环境变量的更简洁的即席、一次性方法:
var1=5253413 var2=39151 perl-E'say$ENV{var1}/$ENV{var2}
@mklement0:我考虑过将其包括在内,但认为它比perl更集中于shell技术。但现在回想起来,我想这就是这个问题的全部内容。我会留下你的评论来代表它。顺便说一句,最快(也是最脏)的方法就是perl-e'print'$var1/$var2-l
@reinierpost,我试过了,但没有成功。为什么它被认为是脏的?@汤姆:你说它不起作用是什么意思?错误消息是什么?它脏的原因是,只有当$var1
和$var2
被设置为数字时(例如,它们不能包含任何空格),它才会工作。它不工作的原因是var1/var2
只是Perl的文本。即使将其更正为$var/$var2
,脚本也看不到这两个变量是在调用脚本的shell中定义的。您必须以某种方式将其值传递给脚本(例如,作为环境变量,请参见答案)。环境变量也可通过全局%ENV
哈希<当然,code>shell#export FOO=BAR&&perl-E'say$ENV{FOO}@Joshua,但是许多需要一行程序的perl黑客和管理员只需键入$ENV{this}
和$ENV{that}
)这是一个非常好的主意,我几乎想投赞成票作为答案。但是,仅仅使用双引号不是很好吗?出于某种原因,这个答案被删除了,但是有人说您可以执行perl-e“print$var1/$var2”-l
@Tom,简单地将shell变量插入到perl命令字符串中的危险是双重的。首先,这些结构让那些不能正确使用引号和变量扩展的人感到困惑-这是“$foo”
shell变量还是perl变量当你在引号中加引号时,会很快变得不透明。其次,这种做法本质上是对perl程序的评估,是一种代码注入机会。“如果你在这件事上过于傲慢,哪怕是一句台词,总有一天你会受伤的。”皮尔克罗。我不太明白你的修辞手法。你能详细解释一下吗?似乎此解决方案与您提供的解决方案完全相同,只是没有导出步骤。用双引号引起来似乎更直观