16

如何在 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;")

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

任何帮助将不胜感激。

谢谢你。

4

6 回答 6

33

来自 shell 的变量在 Perl 的%ENV散列中可用。使用bash(和其他一些 shell),您需要采取额外的步骤“导出”您的 shell 变量,以便子进程可以看到它。

mydate=10/10/2012
export mydate
perl -e 'print "my date is $ENV{mydate}\n"'
于 2012-10-26T20:49:27.410 回答
7

与将值传递给任何其他程序的方式相同:将其作为 arg 传递。(您可能很想生成 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" )
于 2012-10-26T20:14:09.463 回答
7

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

mydate=22/6/2016
perl -e "print $mydate"
于 2016-06-22T14:25:24.007 回答
2

为什么不这样: $ENV{'PATH'} = $ENV{'PATH'}.":"."/additional/path";

于 2015-04-09T15:06:00.207 回答
2

对我来说,我需要使用$ENV{'VARIABLE'}VARIABLEshell 传递给 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'}
于 2018-11-16T23:52:12.787 回答
1

与将值传递给任何其他程序的方式相同:将其作为 arg 传递。(您可能很想生成 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" )
于 2012-10-26T20:39:25.780 回答