一个计算生日的shell脚本

一个计算生日的shell脚本


瞎掰几句

看鸟哥的书也将近半个月了,从信心满满、斗志昂扬到看书半小时睡着十分钟,再到现在怀疑人生(开玩笑了,其实还是满有意思的…~_~!),不管怎样,一路跌跌撞撞,今天总算是踏上了shell大法的修炼之路啊!

这不,在看了鸟哥写的计算退伍日期的shell后,一时控制不住我技几,就打算写一个关于计算生日及其相关时间的shell,顺便来帮自己计算一下自己的生日啦!谁料这中间居然遇到了一个BUG(简直气得不要了),折腾了我这个弱鸡好久才总算解决掉,于是一高兴,打算写下这篇文章,向大家分享这份愉悦!顺便也提醒大家不要踩到我踩过坑哦,不然你会体验到什么是绝望的~_~!


问题重述

写一个shell,实现:让用户输入自己的出生日期,帮他计算出自己还有多少天多少小时后过生日,同时也告诉用户他目前多少岁,已经活了多天,多少小时,多少秒。怎么样,是不是感觉挺简单啊?让我们来看看呢…


思路分析

  • 数据输入:出生年月日,格式:如 20180719 (前四位是出生的年份,后四位为出生的月份和日)
  • 目标分析:我们的主要目标是计算用户距离今年的生日还有多少天多少小时,所以我们这样做:
    • 首先利用用户输入的出生日期计算时间戳(精确到秒)
    • 根据用户的出生日期取出用户的出生月和日(我想这一点不用多说吧!),再取出年份(算岁数)。
    • 从目前的日期中取出今年的年份,可用来拼接上之前的月日成为今年的生日日期,同时也可计算岁数。
    • 有了今年生日的日期,我们就可以计算该日期的时间戳了(同样精确到秒)
    • 利用两者的时间戳差/60/60/24得到天数,剩余的秒数/60/60得到小时数
    • 其它的类似的功能可以类推呢…

坑点提示

我在试图取出出生日期的月和日(也就是后四位数)的时候,比如我输入 19970720 ,用如下的方法去提取
```
declare  -i birth_date_md=$(date --date="$birth_date" +%m%d) # 出生时的月日
```
但遭遇了这样的报错:
```
root@Richard:~/scripts# sh sh11.sh
This program will try to caculate :
How many days before your bithday date...
Please input your birth date (Farmat:YYYYMMDD ex>20180720) : 19970720
date: 无效的日期"2018464" # 后四位不应该是0720吗?
```
分析后才发现,原来我取到的是0720,而我又要它变成整数,所以系统只有把它识别为八进制(0开始的是八进制)翻译成了464,正是这个问题搞得我纠结了好半天,甚至一度想用正则表达式,但是菜鸡的我又用不来,一急之下我把表达式改成这样:

就多了个echo,居然成功了,原来是我把0720转化成了字符串输出到变量里,所以避开了那个问题呢!

declare birth_date_md=$(echo $(date --date="$birth_date" +%m%d)) # 出生时的月日

shell实现

#!/bin/bash
# Program:
#       You input your birthday date, I caculate how many days
#       before your birthday.
# History:
# 2018/7/18 Richard     First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
expot PATH

# 告知用户程序的用途,并且告知输入的日期的格式
echo "This program will try to caculate :"
echo "How many days before your bithday date..."
read -p "Please input your birth date (Farmat:YYYYMMDD ex>20180720) : " birth_date

# 利用正则表达式测试一下这个输入的内容是否合法
date_b=$(echo $birth_date | grep '[0-9]\{8\}')  # 看看是否有八位数字
if [ "$date_b" == "" ]; then
        echo "You input the wrong date format..."
        exit 1
fi

# 计算日期
declare -i birth_date_s=$(date --date="$birth_date" +%s) # 出生日期的秒数
declare -i birth_date_y=$(date --date="$birth_date" +%Y) # 出生日期的年份
declare  birth_date_md=$(echo $(date --date="$birth_date" +%m%d)) # 出生时的月日
declare -i now_date_y=$(date +%Y)                       # 目前的年份
declare -i now_birthday=$now_date_y$birth_date_md       # 本年的生日
declare -i now_birthday_s=$(date --date="$now_birthday" +%s) # 本年生日的秒数
declare -i now_date_s=$(date +%s)       # 目前的时间戳秒数
declare -i now_birth_y=$(($now_date_y-$birth_date_y)) # 距离出生时的年数
declare -i have_birth_s=$(($now_date_s-$birth_date_s)) # 已活秒数
declare -i have_birth_d=$(($have_birth_s/60/60/24))     # 已活天数
declare -i date_total_s=$(($now_birthday_s-$now_date_s)) # 距离生日时的秒数
declare -i date_total_d=$(($date_total_s/60/60/24))     # 距离生日时的天数
if [ "$date_total_s" -lt "0" ]; then
        echo "  *************************************************************************"
        echo "          Your birthday had passed before: " $((-1*date_total_d)) "ago"
        echo "  *************************************************************************"
        echo "          Now, you are $now_birth_y years old!"
        echo "  *************************************************************************"
else
        echo "  *************************************************************************"
        echo "          Now, you are $((now_birth_y-1)) years old!"
        echo "  *************************************************************************"
        echo "          You have lived for $have_birth_d days!"
        echo "  *************************************************************************"
        echo "          Your birthday after $date_total_d days and $(($date_total_s/60/60)) hours."
        echo "  *************************************************************************"
fi

运行结果

root@Richard:~/scripts# sh sh11.sh
This program will try to caculate :
How many days before your bithday date...
Please input your birth date (Farmat:YYYYMMDD ex>20180720) : 19970720
  *************************************************************************
        Now, you are 20 years old!
  *************************************************************************
        You have lived for 7669 days!
  *************************************************************************
        Your birthday after 0 days and 2 hours.
  *************************************************************************

What!今天居然是我生日诶……

完美收工……

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值