bash shell日期解析,从特定日期开始并循环遍历每个月的每一天

时间:2010-04-16 20:22:33

标签: bash shell scripting

我需要创建一个以一天开始的bash shell脚本,然后循环每个后续日格式化输出为%Y_%m_d

我想我可以提交一个开始日,然后提交另一个参数天数。

我的问题/问题是如何设置日期(现在不是),然后添加一天。

所以我的输入是2010_04_01 6

我的输出将是

2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06

8 个答案:

答案 0 :(得分:20)

[radical@home ~]$ cat a.sh 
#!/bin/bash

START=`echo $1 | tr -d _`;

for (( c=0; c<$2; c++ ))
do
    echo -n "`date --date="$START +$c day" +%Y_%m_%d` ";
done

现在,如果您使用params调用此脚本,它将返回您想要的内容:

[radical@home ~]$ ./a.sh 2010_04_01 6
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06

答案 1 :(得分:12)

非常基本的bash脚本应该能够做到这一点:

#!/bin/bash 
start_date=20100501
num_days=5
for i in `seq 1 $num_days`
do 
    date=`date +%Y/%m/%d -d "${start_date}-${i} days"`
    echo $date # Use this however you want!
done

输出:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

答案 2 :(得分:6)

注意:此处的任何解决方案都不适用于OS X.例如,您需要这样的内容:

日期-v-1d +%Y%m%d

昨天会为你打印出来。或者当然还有下划线:

日期-v-1d +%Y_%m_%d

因此,考虑到这一点,您应该能够使用此命令调整这些示例中的某些循环。 -v选项将允许您添加或减去天,分,秒,年,月等。-v + 24d将添加24天。等等。

答案 3 :(得分:2)

#!/bin/bash
inputdate="${1//_/-}"  # change underscores into dashes
for ((i=0; i<$2; i++))
do
    date -d "$inputdate + $i day" "+%Y_%m_%d"
done

答案 4 :(得分:1)

非常基本的bash脚本应该能够做到这一点。

剧本:
#!/ bin / bash

start_date = 20100501
num_days = 5
for seq 1 $num_days中的我 做什么 date = date +%Y/%m/%d -d "${start_date}-${i} days"
echo $ date#使用你想要的!
完成

输出:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

答案 5 :(得分:1)

您也可以使用 cal ,例如

YYYY=2014; MM=02; for d in $(cal $MM $YYYY | grep "^ *[0-9]"); do DD=$(printf "%02d" $d); echo $YYYY$MM$DD; done

(最初发布here on my commandlinefu account

答案 6 :(得分:0)

您可以通过命令行选项 -d 将日期传递给处理多种输入格式的GNU日期:

http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats

将开始日期作为命令行参数传递或使用当前日期:

underscore_date=${1:-$(date +%y_%m_%d)}
date=${underscore_date//_/-}

for days in $(seq 0 6);do 
    date -d "$date + $days days" +%Y_%m_%d;
done

答案 7 :(得分:-1)

你可以使用gawk

#!/bin/bash

DATE=$1
num=$2
awk -vd="$DATE" -vn="$num" 'BEGIN{
   m=split(d,D,"_")
   t=mktime(D[1]" "D[2]" "D[3]" 00 00 00")
   print d
   for(i=1;i<=n;i++){
      t+=86400
      print strftime("%Y_%m_%d",t)
   }
}'

输出

$ ./shell.sh 2010_04_01 6
2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06
2010_04_07