闲来无事,写个计算你啥时候过生日的小小的又有趣的脚本玩玩^~^
脚本内容如下:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH
read -p 'Please input your birthday:' bir
#注意,上面输入的日期格式必须为20120101这样的,且必须为8个长度。
bir_test=$(echo $bir |grep '[0-9]\{8\}')
test -z $bir_test && echo "The length of the input is less than eight" && exit 0
#用grep截取8位长度的日期,如果用户输入的日期长度不够8个时,则$bir_test为空,如果用户输入的
日期长度超过8个时,那么下面会做判断。
bir_s=$(date --date=$bir +%s)
#把用户输入的日期转换成秒
if [ "$?" != 0 ];then
echo "The date of the input formats length more than eight"
exit 1
fi
#上面这个if语句的判断条件是,当一条命令执行完后,如果没有出错,则$?=0 否则$?是不为0的。也就是
说,如果date 命令执行成功,则会返回一个0,要是当用户输入的日期长度超过8位时,则date --date=$bir +%s是会报错,故而会返回一个非0数字。所以我们就可以获取$?的值来判断用户输入日期的长度了。
now_s=$(date +%s)
#把当前日期转换成秒
bir_now_s=$(($bir_s-$now_s))
#用户输入日期的秒减去当前日期的秒
bir_d=$(($bir_now_s/3600/24))
#把两者相减得到的差(秒)转换成天数
bir_h=$(($(($bir_s-$bir_d*3600*24))/3600))
#这是计算余数,然后把余数转换成小时。。这里要注意了,如果不仔细想,你会觉得“$bir_d*3600*24”这不是上一步的相反操作吗?
呵呵,想想为什么要这样做。。。原因很简单,因为“$bir_now_s/3600/24”相除得到的结果是取整数
的,小数部分会丢弃;所以,“$bir_d*3600*24”会小于$bir_now_s
if [ -z "$bir" ];then
echo "No input any value"
#判断用户是否给$bir输入日期或用户输入的日期长度是否达到8个
elif [ "$bir_now_s" -ge 0 ];then
echo "You have $bir_d days and $bir_h hours for my birthday"
#如果$bir_now_s值大于等于0的话,就输出“你还有多少天、多少个小时过生日”
elif [ "$bir_now_s" -lt 0 ];then
echo "You already after $bir_d days and $bir_h hours of birthday"
#如果$bir_now_s值小于0的话,就输出“你已经过了多少天、多少个小时生日”
fi
阅读(2555) | 评论(0) | 转发(0) |