代码之家  ›  专栏  ›  技术社区  ›  Inferno1892

如何根据Solaris中的输入参数计算前“n”个月?

  •  0
  • Inferno1892  · 技术社区  · 11 年前

    我正在Solaris系统上编写脚本,我需要 n 输入参数的前一个月(例如,我需要201308之前第13个月的值),因此我的输出需要 201207 具有 201308 作为shell脚本的输入参数)。

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

    我已经安装了perl,但我似乎无法给出具体的代码。

    任何帮助都将不胜感激。

    2 回复  |  直到 11 年前
        1
  •  0
  •   Daniel Böhmer Ali Shaukat    11 年前

    如果有 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");
    

    根据要求,不使用 日期时间 模块:

    #!/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;
    
        2
  •  0
  •   jlliagre    11 年前

    这也可以通过使用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
    }