script007
题目
编写一个脚本,输入自己的生日时间(日期格式是:YYYYMMDD
),计算还有多少天多少个小时是自己的生日。
分析
本题考查的知识点:
date
命令read
命令if...else
条件语句$(())
思路:
- 首先从键盘读取
YYYYMMDD
格式的生日日期。 - 校验输入的生日参数是否有效。
- 根据输入的生日日期得到月份和天,获取今年的年份,就可以得到今年的具体生日日期。
- 获取今年生日日期距离
1970-01-01 00:00:00
的秒数;获取目前时间距离1970-01-01 00:00:00
的秒数。 - 然后将两者进行求差运算,结果正是距离生日的秒数,如果是正数表示还没有到达生日,如果是负数则表示已经过了今年的生日。
- 将秒数转换成小时和天数后,最后打印输出。
脚本
#!/bin/bash
####################################
#
# 功能:编写一个脚本,输入自己的生日时间(日期格式是:YYYYMMDD),计算还有多少天多少个小时是自己的生日。
#
# 使用:直接执行,不需要任何参数
#
####################################
# 从键盘输入自己的生日
read -p "请输入自己的生日(YYYYMMDD):" birthday
# 校验输入的生日是否符合要求的格式
echo "$birthday" | egrep "[0-9]{8}"
if [ $? -ne 0 ]; then
echo "请输入符合指定格式的生日!"
exit
fi
# 获取今年的年份
y=$(date "+%y")
# 获取生日所在月份
m=$(date --date="$birthday" "+%m")
# 获取生日所在日
d=$(date --date="$birthday" "+%d")
# 获取今年生日距 1970-01-01 00:00:00 的秒数
bir_s=$(date --date="$y$m$d" "+%s")
# 计算当前时间距 1970-01-01 00:00:00 的秒数
now_s=$(date "+%s")
# 计算生日与当前时间相差的秒数
bir_now_s=$(($bir_s-$now_s))
# 把两者相减得到的差(秒)转换成天数
bir_d=$(($bir_now_s/60/60/24))
# 转换小时数
bir_h=$(($bir_now_s/60/60))
# 如果$bir_now_s值大于等于0的话,就输出“你还有多少天、多少个小时过生日”
if [ "$bir_now_s" -ge 0 ];then
echo "还有 $bir_d 天、$bir_h 小时是你的生日!"
# 如果$bir_now_s值小于0的话,就输出“你已经过了多少天、多少个小时生日”
elif [ "$bir_now_s" -lt 0 ];then
echo "你的生日已经过去 $((-1*$bir_d)) 天、$((-1*$bir_h)) 小时了!"
fi
测试
执行 ./script007.sh
调用脚本,然后输入 YYYYMMDD
格式的生日日期。