Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何让命令行Perl接受shell变量?_Bash_Perl - Fatal编程技术网

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代码中,可以使用
    %ENV
    内置哈希访问从shell导出的环境变量

    $ 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
    

两种不太常见的方法利用了长期存在的perl特性

第一个是,它将流程环境变量与perl变量联系起来:

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程序的评估,是一种代码注入机会。“如果你在这件事上过于傲慢,哪怕是一句台词,总有一天你会受伤的。”皮尔克罗。我不太明白你的修辞手法。你能详细解释一下吗?似乎此解决方案与您提供的解决方案完全相同,只是没有导出步骤。用双引号引起来似乎更直观