举例来说,在台湾当兵是国民应尽的义务,不过,在当兵的时候总是很想要退伍的! 那我们可以写个脚本程序来跑,让使用者输入他的退伍日期,让你去帮他计算还有几天才退伍?
由于日期是要用相减的方式来处置,所以我们可以透过使用 date 显示日期与时间,将他转为由 1970-01-01 累积而来的秒数, 透过秒数相减来取得剩余的秒数后,再换算为日数即可。整个脚本的制作流程有点像这样:
- 先让使用者输入他们的退伍日期;
- 再由现在日期比对退伍日期;
- 由两个日期的比较来显示『还需要几天』才能够退伍的字样。
似乎挺难的样子?其实也不会啦,利用『date --date="YYYYMMDD" +%s 』转成秒数后,接下来的动作就容易的多了!如果你已经写完了程序,对照底下的写法试看看:
ps:
date_d=$(echo $date2 | grep -E '^[0-9]{8}$')的表达方式其实可以有好多种,例如:
date_d=$(echo $date2 | egrep -e '^[0-9]{8}$')
date_d=$(echo $date2 | grep '^[0-9]\{8\}$')
其实之前脚本上面的写法是date_d=$(echo $date2 | grep '[0-9]\{8\}'),但是我发现不大严谨,只要那个日期的数位大于匹配的个数,都会输出那个日期,然后经过和朋友们的讨论,最终想到了这个办法,不过这个貌似还不够严谨,如果你要追求完美,那么我们就是用下面的表达式吧!
date_d=$(echo $date2 |grep -E '^[0-9]{4}[0,1][0-9][0-3][0-9]$'
还有最好按照declare -i date_h=$(($(($date_total_s-$date_day*60*60*24))/60/60))这样的格式写~
其实你还可以更精确,但是有什么意思呢,我们已经要求有规则,如果你要是不按照规则办事,一切不就乱了吗,O(∩_∩)O~
=======================下面出错
sh11.sh: line 20: declare: date --date="$date2" + %s: syntax error in expression (error token is "date="$date2" + %s")
sh11.sh: line 21: declare: date + %s: syntax error: operand expected (error token is "%s")
sh11.sh: line 22: -: syntax error: operand expected (error token is "-")
20 declare -i date_dem='date --date="$date2" + %s'
21 declare -i date_now='date + %s'
语法和命令使用上的错误
不要用'xxx' 用`xxx` 或者$() 你date命令使用错误。