免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3847 | 回复: 7
打印 上一主题 下一主题

[SCO UNIX] 计算日期的shell程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-20 17:51 |只看该作者 |倒序浏览
初来乍到, 感觉受益匪浅。刚刚用学到的招数写了一个完整的计算日期的shell,和大家分享一下。能不能再精减,请各位大虾指点指点:
$ date_offset.sh

usage()
{
echo "使用方法:"
echo "    date_offset.sh YYYY/MM/DD offset"
echo "\n举例:"
echo "    date_offset.sh 2001/10/01 -1               返回: 2001/09/30"
echo "    date_offset.sh 2001/10/01 5                返回: 2001/10/06\n"
exit 2
}

yesterday()
{
YEAR=`echo $1|awk -F "/" '{print $1}'`
MONTH=`echo $1|awk -F "/" '{print $2}'`
DAY=`echo $1|awk -F "/" '{print $3}'`
if [ $DAY -eq 1 ]
then
  if [ $MONTH -eq 1 ]
  then
     YEAR=`expr $YEAR - 1`
     MONTH=12
  else
     MONTH=`expr $MONTH - 1`
  fi
  DAY=`echo \`cal $MONTH $YEAR\`|tail -n1|awk '{print $NF}'`
else
  DAY=`expr $DAY - 1`
fi
echo "$YEAR $MONTH $DAY"|awk '{if (length($2)==1) $2=0$2;if (length($3)==1) $3=0$3;printf "%s/%s/%s",$1,$2,$3}'
}

tomorrow()
{
YEAR=`echo $1|awk -F "/" '{print $1}'`
MONTH=`echo $1|awk -F "/" '{print $2}'`
DAY=`echo $1|awk -F "/" '{print $3}'`
LASTDAY=`echo \`cal $MONTH $YEAR\`|tail -n1|awk '{print $NF}'`
if [ $DAY -eq $LASTDAY ]
then
  if [ $MONTH -eq 12 ]
  then
     YEAR=`expr $YEAR + 1`
     MONTH=1
  else
     MONTH=`expr $MONTH + 1`
  fi
  DAY=1
else
  DAY=`expr $DAY + 1`
fi
echo "$YEAR $MONTH $DAY"|awk '{if (length($2)==1) $2=0$2;if (length($3)==1) $3=0$3;printf "%s/%s/%s",$1,$2,$3}'
}

# 检查参数数目
if [ $# -ne 2 ]
then
        echo "\n调用出错: 参数数目不对!\n"
        usage
fi

# 检查参数1长度
if [ `expr length $1` -ne 10 ]
then
        echo "\n调用出错: 日期格式不正确!\n"
        usage
fi

TMP_YEAR=`echo $1|awk -F "/" '{print $1}'`
TMP_MONTH=`echo $1|awk -F "/" '{print $2}'`
TMP_DAY=`echo $1|awk -F "/" '{print $3}'`

if ! expr $TMP_YEAR + $TMP_MONTH + $TMP_DAY >;/dev/null 2>;&1
then
        echo "\n调用出错: 日期格式不正确!\n"
        usage
fi

if [ `expr length $TMP_YEAR` -ne 4 ]
then
        echo "\n调用出错: 日期格式不正确!\n"
        usage
fi

if [ $TMP_MONTH -lt 1 ] || [ $TMP_MONTH -gt 12 ]
then
        echo "\n调用出错: 日期格式不正确!\n"
        usage
fi

LAST_DAY=`echo \`cal $TMP_MONTH $TMP_YEAR\`|tail -n1|awk '{print $NF}'`
if [ $TMP_DAY -lt 1 ] || [ $TMP_DAY -gt $LAST_DAY ]
then
        echo "\n调用出错: 日期格式不正确!\n"
        usage
fi

# 检查参数2是否为数值
expr $2 + 0 >;/dev/null 2>;&1
if [ ! $? ]
then
        echo "\n调用出错: 日期偏移量应为整数值!\n"
        usage
fi

TMP_DATE=$1
if [ $2 -lt 0 ]
then
        INC=-1
        COUNT=$2
else
        INC=1
        COUNT=`expr 0 - $2`
fi
while [ $COUNT -lt 0 ]
do
        if [ $INC -gt 0 ]
        then
                TMP_DATE=`tomorrow $TMP_DATE`
        else
                TMP_DATE=`yesterday $TMP_DATE`
        fi
        COUNT=`expr $COUNT + 1`
done
echo $TMP_DATE
#在要SCO 5.0.5下测试通过。

论坛徽章:
0
2 [报告]
发表于 2003-03-20 21:32 |只看该作者

计算日期的shell程序

好像没什么用啊

论坛徽章:
0
3 [报告]
发表于 2003-05-16 11:07 |只看该作者

计算日期的shell程序

有用的,我正好需要,做一个自动删除或移走数据库的日志文件!

论坛徽章:
0
4 [报告]
发表于 2008-08-07 13:52 |只看该作者
太好了,我今天刚刚好需要计算日期的shell。谢谢了!

论坛徽章:
0
5 [报告]
发表于 2008-08-07 23:40 |只看该作者
你没用,但是别人就可以用上的。

论坛徽章:
0
6 [报告]
发表于 2008-08-08 22:59 |只看该作者
没试SCO unix的date是否支持:
bash-3.2$ date -d "yesterday"
Thu Aug  7 22:51:47     2008
bash-3.2$ date -d "-1day"
Thu Aug  7 22:52:04     2008
bash-3.2$ date -d "-1day 20080101"
Mon Dec 31 00:00:00     2007
bash-3.2$ date -d "+1day 20080101"
Wed Jan  2 00:00:00     2008
bash-3.2$ date -d "+300 day 20080101"
Mon Oct 27 00:00:00     2008
bash-3.2$ date -d "+300 day 2008/01/01"
Mon Oct 27 00:00:00     2008
bash-3.2$ date -d "+300 day 2008-01-01"
Mon Oct 27 00:00:00     2008

bash-3.2$ gawk 'BEGIN{print strftime("%Y年%m月%d日",(-10)*24*3600+mktime("2008 01 01 00 00 00"));}'
2007年12月22日
写成shell:
bash-3.2$ cat t.sh
gawk 'BEGIN{print strftime("%Y年%m月%d日",('$2')*24*3600+mktime("'"$1"' 00 00 00"));}'

bash-3.2$ ksh t.sh "2008 01 01" -10
2007年12月22日
bash-3.2$

[ 本帖最后由 zhangshebao 于 2008-8-8 23:25 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-08-10 21:02 |只看该作者
好像没什么用啊。

论坛徽章:
0
8 [报告]
发表于 2008-08-24 12:01 |只看该作者

回复 #6 zhangshebao 的帖子

这是BASH的功能。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP