2017-01-17 95 views
0

我必須創建一個shell腳本文件,它接受一個字符串,開始日期和結束日期,並以下面的格式生成輸出文件。在AIX上的shell腳本中的遞增日期

注:日期是MM/DD/YYYY

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

我不能夠增加日期。我嘗試使用date -d選項,但它在AIX上不可用。

有人可以請幫助一個內置的shell腳本命令或perl命令來增加日期嗎?

+0

您可以安裝第三方perl模塊,還是需要堅持使用內置功能?如果後者,你有哪個版本的Perl? (另外,你是否有Python解釋器?如果是這樣,又是什麼版本?) –

+4

...拋開:「MM/DD/YYYY」可能是最差的廣泛使用的日期格式(除MON/DD/YY'):ASCII排序對待它很糟糕,它通常是不明確的(通常不能分辨是否使用'DD/MM/YYYY',這也很受歡迎)。當你有控制權時,'YYYY-MM-DD'是正確的事情:它對人類讀者來說不那麼模糊,它符合RFC標準,而且分類很好。 –

+1

「'MM/DD/YYYY'也許是最糟糕的廣泛使用的日期格式」更何況,它甚至沒有任何意義。 – ThisSuitIsBlackNot

回答

2

鑑於 '使用核心' 的約束:

#!/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

+0

喜歡ISO 8601鏈接 - 多麼真實! –

0

您可以用awk這樣做一個shell腳本:

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不加入什麼到解決方案,但將有助於防止輸入值或維護腳本中的錯誤。