如何在Bash shell脚本中调用Perl命令并使用Shell变量?

19

如何在bash shell脚本中,调用perl命令时使用shell变量?

我的shell脚本中有一个perl命令,用于计算前一天的日期。

我该如何在perl命令中使用$myDate这个变量?

以下是我脚本中的相关部分:

myDate='10/10/2012'

Dt=$(perl -e 'use POSIX;print strftime '%m/%d/%y', localtime time-86400;")

我希望使用$myDate替代%m/%d/%y

非常感谢您的帮助。

谢谢。


1
除非您将myDate的值更改为类似于%m/%d/%y的内容,否则用'%m/%d/%y'替换它没有任何意义。请适当修正您的问题。 - ikegami
6个回答

36

从 shell 中的变量可以在 Perl 的 %ENV 哈希表中使用。对于 bash(以及其他一些 shell),您需要额外采取“导出”您的 shell 变量的步骤,以便它对子进程可见。

mydate=10/10/2012
export mydate
perl -e 'print "my date is $ENV{mydate}\n"'

4
这是一个简单的回答,规则清晰。上面那个看起来像一些我无法理解的复杂代码。 - Henley
2
另外,如果你运行 perl -p,那么它会将 -- 解释为文件名,因此只有在这种脚本中才能使用 $ENV。 - sdbbs
@henley-chiu:公平地说,@ikegami的答案采用“-- arg”方法避免了污染bash环境,而在bash函数或别名中使用export意味着使用export运行函数/别名将导致“mydate”在整个bash会话期间被设置。 - robla

8

在5.24版本中,使用双引号"而不是单引号'也会将shell变量传递给perl。

mydate=22/6/2016
perl -e "print $mydate"

1
这是Ikegami在被接受的答案中不建议的东西,理由很充分。如果您完全控制mydate并且了解自己在做什么,则将其作为Perl代码进行插值是可以的...但在这种情况下显然不是这样,因此此片段将生成不稳定的输出 0.00181878306878307 - tripleee

6

您可以像将值传递给其他程序一样进行传递:作为参数传递。 (您可能会想生成Perl代码,但这是一个坏主意。)

Dt=$( perl -MPOSIX -e'print strftime $ARGV[0], localtime time-86400;' -- "$myDate" )

请注意,代码并不总是返回昨天的日期(因为并非所有的一天都有86400秒)。 如果需要这样做,您需要:
Dt=$( perl -MPOSIX -e'my @d = localtime time-86400; --$d[4]; print strftime $ARGV[0], @d;' -- "$myDate" )

或者

Dt=$( perl -MDateTime -e'print DateTime->today(time_zone => "local")->subtract(days => 1)->strftime($ARGV[0]);' -- "$myDate" )

或者简单地说
Dt=$( date --date='1 day ago' +"$myDate" )

本文假设您想使用“myDate”作为格式说明符,正如您所说的那样,这意味着“myDate”实际上包含类似于“%m/%d/%y”的内容。 - ikegami

3

对我而言,我需要使用$ENV{'VARIABLE'}将shell中的VARIABLE传递给Perl。我不知道为什么简单的$ENV{VARIABLE}无法工作。

例如:

在Bash中:

#!/bin/bash -l
VARIABLE=1
export VARIABLE
perl example.pl

在Perl中:
#!/usr/bin/perl -w
print "my number is " . $ENV{'VARIABLE'}

2
为什么不使用这样的方法: $ENV{'PATH'} = $ENV{'PATH'}.":"."/additional/path";

1
和传递值给其他程序的方式一样:将其作为参数传递。(你可能会想生成Perl代码,但这是一个坏主意。)
Dt=$( perl -MPOSIX -e'my($m,$d,$y) = split qr{/}, $ARGV[0]; --$d; print strftime "%m/%d/%y", 0,0,0, $d,$m-1,$y-1900;' -- "$myDate" )

本文假设您实际上想使用myDate作为要修改的日期,而不是格式说明符。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接