【问题标题】:Increment date in shell script on AIX [duplicate]AIX 上的 shell 脚本中的递增日期 [重复]
【发布时间】:2024-01-10 02:41:01
【问题描述】:

我必须创建一个接受字符串、开始日期和结束日期的 shell 脚本文件,并生成以下格式的输出文件。

注意:日期为 MM/DD/YYYY

string,start date
string,start date + 1
...
string,end date

我无法增加日期。我尝试使用 date -d 选项,但它在 AIX 上不可用。

有人可以帮助使用内置的 shell 脚本命令或 perl 命令来增加日期吗?

【问题讨论】:

  • 您可以安装第 3 方 perl 模块,还是需要坚持使用内置功能?如果是后者,你到底有哪个版本的 Perl? (另外,你有 Python 解释器吗?如果有,那又是哪个版本?)
  • ...aside:MM/DD/YYYY 可能是最糟糕的广泛使用的日期格式(MON/DD/YY 除外):ASCII 排序处理它很糟糕,而且它通常是模棱两可的(通常无法分辨如果你使用DD/MM/YYYY,这也很流行)。当您拥有控制权时,YYYY-MM-DD 是正确的选择:它对人类读者来说不那么模棱两可,它符合 RFC,而且它的分类很好。
  • "MM/DD/YYYY 可能是最糟糕的广泛使用的日期格式" 更不用说它甚至没有意义。
  • 如果没有内置模块,就没有 Perl。 Perl 是解释器,解释器附带的模块及其 POD(文档)。
  • DateTime 不是内置模块。请参阅常见问题解答:perldoc.perl.org/… ...那里表达的原则将适用于您的问题“我如何找到明天的日期?”请特别注意 Time::Piece 和 Time::Seconds,因为它们是随 Perl 一起提供的。

标签: perl shell date sh ksh


【解决方案1】:

给定“使用核心”的约束:

#!/usr/bin/env perl

use strict;
use warnings;
use Time::Piece;
use Time::Seconds;

my $FORMAT = '%m/%d/%Y';

my $start = '01/22/2016';
my $end   = '01/31/2016';

my $start_t = Time::Piece->strptime( $start, $FORMAT );
my $end_t   = Time::Piece->strptime( $end,   $FORMAT );

while ( $start_t <= $end_t ) {
   print $start_t ->strftime($FORMAT), "\n";
   $start_t += ONE_DAY;
}

Time::PieceTime::Seconds 都是 perl 5.9.5 的核心。后者仅对 ONE_DAY 需要 - 否则您可以添加 60 * 60 * 24 代替。

我相信您可以自己弄清楚如何打印字符串等。

(我还要注意 - 这是一种可怕的时间格式,should be avoided

【讨论】:

  • 喜欢 ISO 8601 链接 - 多么真实!
【解决方案2】:

您可以像这样使用 awk 制作 shellscript:

str="some string"
startd="12/25/2016"
endd="1/17/2017"

maxloop=10

echo "${maxloop}" |
awk -v string="${str}" -v startdate="${startd}" -v enddate="${endd}" '{
    split(startdate,A,"[/]");
    T1=mktime(A[3] " " A[1] " " A[2] " 0 0 0");
    split(enddate,B,"[/]");
    T2=mktime(B[3] " " B[1] " " B[2] " 23 59 59");
    linenr=1;
    while (T1 < T2) {
       printf("%s,%s\n",string,
          strftime("%m-%d-%Y",T1));
       T1+=3600*24;
       if (linenr++ > $1) break;
    }
}'

linenr/maxloop 并没有在解决方案中添加任何东西,但有助于防止 输入值错误或脚本维护错误。

【讨论】: