【问题标题】:Perl: how to make date as argument to perl scriptPerl:如何将日期作为 perl 脚本的参数
【发布时间】:2014-07-29 14:28:30
【问题描述】:

我像这样从终端手动运行脚本:

# perl renew.pl 2014-06-09 data.xml

2014-06-09 是今天的日期,data.xml 是脚本更新的文件。

我想用 cron 运行这个脚本,所以我需要自动插入当前日期。 我尝试过类似

# perl renew.pl date +"%Y/%m/%d" data.xml <br>
or <br>
# perl renew.pl 'date +"%Y/%m/%d"' data.xml<br>
or <br>
# TODAY=`date '+%Y%m%d'`; perl renew.pl TODAY data.xml

但总是得到如下响应:

在 /usr/lib/perl5/site_perl/5.8.8/Date/Calc/PP.pm 第 1547 行的数字 ge (>=) 中使用未初始化的值 523. Date::Calc::PP::Add_Delta_Days(): Date::Calc::Add_Delta_Days(): not a valid date at renew.pl

是否有任何其他变体可以插入日期作为参数?

【问题讨论】:

  • 你为什么不使用内置函数而不是在命令行传递它
  • 您在命令行示例中使用了不同的日期分隔符。如果无法访问代码,很难判断这是否重要。

标签: perl shell date cron crontab


【解决方案1】:

我不确定 shell crond 使用什么。也许这是您的登录外壳?如果它像我一样使用shbash,你想要

perl renew.pl "`date +"%Y/%m/%d"`" data.xml

或更具可读性

perl renew.pl "$( date +"%Y/%m/%d" )" data.xml

`...` aka $( ... ) 执行其中的命令,并插入其输出。周围的双引号会转义空格等,以便将结果作为单个参数传递。 (这里不需要它们。我出于习惯使用它们。安全总比抱歉好。)


让我们看看你尝试了什么:

  • perl renew.pl date +"%Y/%m/%d" data.xml 传递 date+%Y/%m/%ddata.xml 作为参数。

    缺少前面提到的反引号。

  • perl renew.pl 'date +"%Y/%m/%d"' data.xml 传递 date +"%Y/%m/%d"data.xml 作为参数。

    缺少前面提到的反引号。

  • TODAY=date '+%Y%m%d'; perl renew.pl TODAY data.xmlTODAYdata.xml 作为参数传递。

    您最终使用了反引号,但实际上并没有使用存储结果的变量。你应该使用"$TODAY" 而不是TODAY

【讨论】:

  • 非常感谢!这就是我需要的!
  • 如果这回答了您的问题,请勾选答案旁边的标记。欢迎来到堆栈溢出 :)
【解决方案2】:

可以在bash 中尝试以下任一方法:

export TODAY=$(date +%Y%m%d); perl renew.pl $TODAY data.xml

或者没有中间变量:

perl renew.pl $(date +%Y%m%d) data.xml

您也可以将renew.pl 编辑为仅使用 1 个参数调用时默认为今天的日期:

use strict;
use warnings;

use Time::Piece;

unshift @ARGV, localtime->strftime("%Y-%m-%d") if @ARGV == 1;

然后:

perl renew.pl data.xml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2017-04-01
    • 1970-01-01
    • 2015-09-21
    • 2011-05-20
    • 2015-03-15
    相关资源
    最近更新 更多