【问题标题】:How to calculate previous 'n' months from an input parameter in Solaris?如何从 Solaris 中的输入参数计算前“n”个月?
【发布时间】:2015-06-02 09:42:47
【问题描述】:

我正在 Solaris 系统上编写脚本,我需要从输入参数中获取上个月的第 n 个月(例如,我需要 201308 之前第 13 个月的值 - 所以我的输出必须是201207201308 作为我的 shell 脚本的输入参数)。

我发现的大多数示例都是使用 GNU,但由于我的机器是服务器并且我没有管理员权限,因此我无法在那里安装 GNU。

我已经安装了 perl,但我似乎无法为此提供确切的代码。

任何帮助将不胜感激。

【问题讨论】:

    标签: perl unix datetime solaris


    【解决方案1】:

    鉴于已安装 DateTime 模块,或者您可以从 CPAN 安装模块(至少安装到您的主目录中):

    #!/usr/bin/env perl
    
    use DateTime;
    
    my $in = $ARGV[0] or die "No input";
    my ( $year, $month ) = ( $in =~ m/^(\d\d\d\d)(\d\d)$/ ) or die "Wrong format";
    my $dt = DateTime->new( year => $year, month => $month );
    $dt->subtract( months => 13 );
    print $dt->strftime("%Y%m\n");
    

    根据要求提供不使用DateTime 模块的版本:

    #!/usr/bin/env perl
    
    my $in = $ARGV[0] or die "No input";
    my ( $year, $month ) = ( $in =~ m/^(\d\d\d\d)(\d\d)$/ ) or die "Wrong format";
    $month -= 13;
    while ( $month < 1 ) {
        $year  -= 1;
        $month += 12;
    }
    printf "%04i%02i\n", $year, $month;
    

    【讨论】:

    • 感谢 Daniel,我将您的代码保存在名为 datecalc 的文件中,并使用输入参数 201308 执行。我收到以下错误消息:Can't locate DateTime.pm in @INC (@INC包含: /usr/opt/perl5/lib/5.8.8/aix-thread-multi /usr/opt/perl5/lib/5.8.8 /usr/opt/perl5/lib/site_perl/5.8.8/aix-thread -multi /usr/opt/perl5/lib/site_perl/5.8.8 /usr/opt/perl5/lib/site_perl .) at ./datecalc 第 3 行。BEGIN 失败——编译在 ./datecalc 第 3 行中止。跨度>
    • 表示DateTime模块没有安装。我将发布一个没有 DateTime 的日期数学更新。
    【解决方案2】:

    这也可以通过使用 Solaris 10 ksh 的基本 shell 脚本来完成:

    previousNMonth()
    {
      y=$(echo $1|sed 's/..$//')
      m=$(echo $1|sed 's/^....//')
      m=$((m-$2))
      while [ $m -lt 1 ]; do m=$((m+12)); y=$((y-1)); done
      printf "%04d%02d\n" $y $m
    } 
    
    $ previousNMonth 201308 13
    201207
    

    如果您使用的是 Solaris 11,这里是一个纯 shell 的 ksh93 版本,即不依赖外部命令:

    previousNMonth()
    {
      y=${1:0:4}
      m=$((${1:4:2}-$2))
      while (( m < 1)); do m=$((m+12)); y=$((y-1)); done
      printf "%04d%02d\n" $y $m
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多