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

use*_*087 13 bash shell perl awk

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

我在shell脚本中有一个perl命令来评估日期-1.

我如何$myDate在perl命令调用中使用?

这是我脚本中的部分:

myDate='10/10/2012'

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

我想用$myDate代替%m/%d/%y.

任何帮助将不胜感激.

谢谢.

mob*_*mob 28

shell中的变量以Perl的%ENV哈希值提供.使用bash(以及其他一些shell),您需要采取额外的步骤"导出"shell变量,以便子进程可以看到它.

mydate=10/10/2012
export mydate
perl -e 'print "my date is $ENV{mydate}\n"'
Run Code Online (Sandbox Code Playgroud)

  • 这是一个简单的答案.上面的那个看起来就像是一些我无法理解的复杂代码 (4认同)
  • 另外,如果运行`perl -p`,那么它将` - `解释为文件名,因此只能在这样的脚本中使用$ ENV (2认同)

ike*_*ami 6

将值传递给任何其他程序的方法相同:将其作为arg传递.(您可能想要生成Perl代码,但这是一个坏主意.)

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

请注意,代码并不总是返回昨天的日期(因为并非所有日期都有86400秒).为此,你想要的

Dt=$( perl -MPOSIX -e'my @d = localtime time-86400; --$d[4]; print strftime $ARGV[0], @d;' -- "$myDate" )
Run Code Online (Sandbox Code Playgroud)

要么

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

或者干脆

Dt=$( date --date='1 day ago' +"$myDate" )
Run Code Online (Sandbox Code Playgroud)


One*_*ace 5

在版本5.24中,using "而不是'还将shell变量传递给perl。

mydate=22/6/2016
perl -e "print $mydate"
Run Code Online (Sandbox Code Playgroud)