日期:2014-05-16 浏览次数:20825 次
#!/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
------解决方案--------------------