Perl:如何将日期作为Perl脚本的参数

Perl:如何将日期作为Perl脚本的参数,perl,shell,date,cron,crontab,Perl,Shell,Date,Cron,Crontab,我从终端手动运行脚本,如下所示: # 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> o

我从终端手动运行脚本,如下所示:

# 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
#perl renew.pl date+%Y/%m/%d”data.xml

#perl renew.pl'date+%Y/%m/%d“'data.xml

#今天=`date'+%Y%m%d`;perl renew.pl TODAY data.xml
但总是得到这样的回应:

在/usr/lib/perl5/site_perl/5.8.8/Date/Calc/PP.pm第1547行的数字ge(>=)中使用未初始化值 523Date::Calc::PP::Add_Delta_Days():Date::Calc::Add_Delta_Days():在renew.pl上不是有效的日期


是否有其他变量可以插入日期作为参数

可以在
bash
中尝试以下任一操作:

export TODAY=$(date +%Y%m%d); perl renew.pl $TODAY data.xml
或不带中间变量:

perl renew.pl $(date +%Y%m%d) data.xml
当仅使用1个参数调用时,您还可以编辑您的
renew.pl
,将其默认为今天的日期:

use strict;
use warnings;

use Time::Piece;

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

perl renew.pl data.xml

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

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/%d
    data.xml
    作为参数传递

    缺少前面提到的背景标记

  • perl renew.pl'date+%Y/%m/%d”data.xml
    date+%Y/%m/%d”和
    data.xml
    作为附件传递

    缺少前面提到的背景标记

  • 今天=
    日期'+%Y%m%d'
    ;perl renew.pl TODAY data.xml
    TODAY
    data.xml
    作为参数传递

    您最终使用了backticks,但实际上并没有使用存储结果的变量。您应该使用
    “$TODAY”
    而不是
    TODAY


为什么不使用内置函数而不是在命令行中传递它?在命令行示例中,您使用的是不同的日期分隔符。如果没有访问代码,很难判断这是否重要。非常感谢!这就是我需要的!如果回答了您的问题,请勾选答案旁边的标记。欢迎使用堆栈溢出:)