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

How to calculate previous 'n' months from an input parameter in Solaris?

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

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

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

任何帮助将不胜感激。

如果安装了 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;

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

previousNMonth()
{
  y=$(echo |sed 's/..$//')
  m=$(echo |sed 's/^....//')
  m=$((m-))
  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}-))
  while (( m < 1)); do m=$((m+12)); y=$((y-1)); done
  printf "%04d%02d\n" $y $m
}