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

Posted

技术标签:

【中文标题】如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?【英文标题】:How to use shell variables in perl command call in a bash shell script? 【发布时间】:2012-10-17 02:52:04 【问题描述】:

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

我的 shell 脚本中有一个 perl 命令来计算日期 -1。

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

这是我脚本中的部分:

myDate='10/10/2012'

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

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

任何帮助将不胜感激。

谢谢。

【问题讨论】:

myDate 的值替换'%m/%d/%y' 没有任何意义,除非您将myDate 的值更改为%m/%d/%y 之类的值。请适当地解决您的问题。 【参考方案1】:

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

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

【讨论】:

这是一个规则的简单答案。上面的只是看起来像一些我无法理解的复杂代码 另外,如果您运行perl -p,那么它会将-- 解释为文件名,因此只能在此类脚本中使用$ENV @henley-chiu :公平地对待@ikegami 接受的答案,使用“--arg”方法可以避免污染 bash 环境,而在 bash 函数或别名中使用 export 意味着运行带有export 的函数/别名将导致在 bash 会话期间设置“mydate”。【参考方案2】:

与将值传递给任何其他程序的方式相同:将其作为 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" )

【讨论】:

这篇文章假设你想使用myDate作为你所说的格式说明符,这意味着myDate实际上包含%m/%d/%y之类的东西。【参考方案3】:

在 5.24 版本中使用 " 代替 ' 也会将 shell 变量传递给 perl。

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

【讨论】:

这是池上在接受的答案中建议反对的,有充分的理由。如果您可以完全控制mydate 并了解您在做什么,那么将其作为 Perl 代码进行插值就可以了……但在这种情况下肯定不是这样,因此这个 sn-p 将产生不稳定的输出 0.00181878306878307【参考方案4】:

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

【讨论】:

【参考方案5】:

对我来说,我需要使用$ENV'VARIABLE' 将shell 中的VARIABLE 传递给Perl。我不知道为什么只是 $ENVVARIABLE 不起作用。

例如,

在 Bash 中:

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

在 Perl 中:

#!/usr/bin/perl -w
print "my number is " . $ENV'VARIABLE'

【讨论】:

【参考方案6】:

与将值传递给任何其他程序的方式相同:将其作为 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" )

【讨论】:

这篇文章假设你真的想使用myDate作为修改日期而不是格式说明符。

以上是关于如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不运行Bash脚本的情况下语法检查?

用 java 重写 Perl 和 shell 脚本有意义吗?

shell脚本

bash脚本中的Perl哈希等效? [复制]

如何在perl脚本中忽略shell命令的退出状态

为啥脚本语言(例如 Perl、Python、Ruby)不适合作为 shell 语言? [关闭]