日期:2014-05-16 浏览次数:20668 次
#!/bin/sh START=$1 END=$2 while (( $START < $END)) do if (( $(($START + 6)) < $END )) then echo $START --- $(($START + 6)) else echo $START --- $END fi START=$(($START + 7)) done
------解决方案--------------------
支持1楼
START=$(($START + 7))
也可以这么写
((START=START+7))
------解决方案--------------------
不支持上面的
日期需要判断吧
LZ给的日期恰好 是一月的,如果是跨月、跨年的情况都没考虑。。。。
------解决方案--------------------
看lz的应用场景了,对于跨月、跨年的是比较麻烦
lz的操作系统不是linux ?
------解决方案--------------------
对于2012.1 一个完整月份的情况,也可以这样
cal 1 2012 | sed -n '3,$p' | xargs -n1 printf "2012%02d%02d\n" 1|paste - - - - - - -|awk '{print $1, "--", $NF}'
------解决方案--------------------
提供一个思路
1、对于linux系统,可以把时间转换为秒数,然后根据秒数循环输出
2、对于其他系统,可以把起止时间之间的所有时间字符串都存放在一个数组中,循环输出,比较麻烦
一个简单的示例脚本,以2012.1为例
#!/bin/ksh i=0 set -A dtstr cal 1 2012 | sed -n '3,$p' | xargs -n1 echo |\ while read a do ((i=i+1)) dtstr[$i]=`printf "2012%02d%02d" 1 $a` done j=1 while [[ $j -le $i ]] do echo ${dtstr[$j]} ((j=j+1)) done
------解决方案--------------------
#!/bin/bash if [ $# -lt 2 ];then echo "invalid arguments..."; exit 1; fi start_time=$( date -d $1 +"%s" ); end_time=$( date -d $2 +"%s" ); blank_time=$( expr 7 \* 24 \* 60 \* 60 ); cur_time=$start_time; pre_time=""; while [ "$cur_time" -le "$end_time" ];do if [ "$pre_time" != "" ];then left=$( date -d "1970-01-01 UTC ${pre_time} seconds" +"%Y%m%d" ); temp_time=$( expr ${cur_time} - 24 \* 60 \* 60 ); right=$( date -d "1970-01-01 UTC ${temp_time} seconds" +"%Y%m%d" ); printf "%s --- %s\n" $left $right; fi pre_time=$cur_time; cur_time=$( expr $cur_time + $blank_time ); done if [ "$cur_time" -ne "$end_time" ];then left=$( date -d "1970-01-01 UTC $pre_time seconds" +"%Y%m%d" ); right=$( date -d "1970-01-01 UTC $end_time seconds" +"%Y%m%d" ); printf "%s --- %s\n" $left $right; fi owenliang@linux-7lsl:~/csdn/shell> ./file.sh 20120101 20120131 20120101 --- 20120107 20120108 --- 20120114 20120115 --- 20120121 20120122 --- 20120128 20120129 --- 20120131
------解决方案--------------------