#!/bin/bash#Program:# You input your demobilization date, i calculate now many days before you demobilize.#History:#2015/06/18 Awake First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo"This program will try to colculate :"echo"How many days before your demobilization date ..."read -p "Please input your demobilization date (YYYYMMDD ex>20180401):" date2 //让用户输入date2的变量内容如20180401这样的八位数的日期
date_d=$(echo $date2 |grep'[0-9]\{8\}') //利用正则表达式测试一下输入的内容是否正确,看看是否有八个数字,我在shell下测试如果仅输入echo 12345678 |grep'[0-9]\{8\}',那么可以输出12345678这个数字,如果输入的位数不够,或者不是数字那么就没有显示
if["$date_d"==""];then //如果date_d这个变量内容是空,那么就执行下面的语句告诉用户输入的格式不对,退出,并返回值为1(1代表什么是OS error code 1: Operation not permitted)
echo"You input the wrong date format...."exit 1
fi
//开始计算日期,这部分的计算是建立在用户输入了8位数字的前提下的
declare -i date_dem=`date --date="$date2" +%s` //声明变量date_dem(退伍日期)的秒数,也即1970年1月1日至输入的日期($date2)的秒数(这两行我认为没有整数运算,只是一个变量名等于一个命令而已,可以将declare -i去掉,我试过去掉也是正常的)
declare -i date_now=`date +%s` //声明变量date_now为现在的时间,也即1970年1月1日至现在系统时间的秒数
declare -i date_total_s=$(($date_dem-$date_now)) //声明变量date_total_s的数值为退伍时间减去现在的时间,即还有多少时间(秒)退伍?
declare -i date_d=$(($date_total_s/60/60/24)) //这个date_d不要和上面的date_d变量混淆,是剩余的秒数除以60秒、60分钟、24小时,即得剩余天数(这种格式只支持整数的算法)
if["$date_total_s" -lt "0"];then //判断是否退伍,如果$date_total_s小于0了,也就是用户输入了一个历史时间,那么执行下面的命令,提示表示已经退伍了,并且显示退伍多少天了,$((-1*$date_d))只是将那个小于0的数值(负数)变成正数
echo"You had been demobilization before:"$((-1*$date_d))"ago"else //否则,执行下面的命令,
declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60)) //其实是两层计算式,编者是要算出除几天外,还有几个小时,看来真是迫切啊!先从最里边开始看,还有多少时间退伍(秒数)减去剩余的天数乘以60秒、60分、24小时(也是秒数,只不过这个秒数是整天的秒数,没有余数的)得到的结果也就是一天中剩下的秒数,在除以60秒、60分,也就是小时数了。
echo"You will demobilize after $date_d days and $date_h hours."fi[root@awake scripts]#//其实我感觉这个例子挺难理解的,估计也是编者做了多方测试,得到的结果。 最难理解的是date_h的计算,要用总的剩余秒数减去剩余天数【(date_d)*60*60*24】得出剩余的秒数再除以60再除以60,得出剩余的小时数,这个逻辑有点绕。