计算自己还有几天过生日
1 #!/bin/bash
2 echo -e "I will calculate you brithday .Please input you brithday(MMDD)"
3 read brithday
4 brithday_temp=$(echo $brithday | grep '[0-9]\{4\}')
5 if [ "$brithday_temp" == "" ] ; then
6 echo "You input is wrong !!"
7 exit 0
8 fi
9 now=$(date +%m%d)
10 if [ "$brithday" == "$now" ] ; then
11 echo "Today is your brithday "
12 elif [ "$brithday" -gt "$now" ] ; then
13 year=$(date +%Y)
14 brithday_second=$(date --date="$year$brithday" +%s)
15 now_second=$(date +%s)
16 brithday_days_temp=$(($brithday_second - $now_second))
17 brithday_days=$(($brithday_days_temp/60/60/24))
18 echo "your brithday have $brithday_days days "
19 else
20 year=$(( `date +%Y` + 1))
21 brithday_second=$(date --date="$year$brithday" +%s)
22 now_second=$(date +%s)
23 brithday_days_temp=$(($brithday_second-$now_second))
24 brithday_days=$(($brithday_days_temp/60/60/24))
25 echo "your brithday have $brithday_days days "
26 fi
27 exit 0
执行结果:
设计思路:
1.生日的计算无关于年份,只在乎月份和日期,因此我们让用户只输入月份和日期。
2.进行检测看看是否有四个数字,如果没有就跳出。
3.比较结果有三种情况:
1.等于now(即今天),输出Today is your brithday ,结束。
2.大于now,计算生日那天到标准时间(即1970年1月1日)所经历的秒数,再计算今天到标准时间所经历的秒数,两数相减再进行转换既得天数,结束。
3.小于now,给年份加1,计算同上,结束。
注意事项:
1.echo -e
(-e 选项可以激活转义字符。如:\n,\t 等)
2.grep '[0-9]\\{4\\}'
(正则表达式的用法,自行查阅)
3.if [ "$brithday_temp" == "" ] ; then
1.[ ]中括号内的东西都要用空格来分隔,“一句话--疯狂空格”
2.不论变量或者是常量,一律用双引号括起来
3.if与[] 不可以连起来写,但[] 可以与后面的内容连起来写(不建议这样操作)。如图:
4.等于号一律用 == (PS:在bash中,= 和 == 号作用一样)
4. $( ) 与` ` (反单引号) 内的命令可以提前被执行(建议使用\$( ) )
5.elif [ "$brithday" -gt "$now" ] ; then
1.-gt:大于(Greater than)
2.-lt:小于(lesser than)
3.-eq:等于(equal)
4.-ge:大于等于(Greater or equal)
ps:以上都可以用人用的<,>,== 来替换
6. brithday_days=$(($brithday_days_temp/60/60/24))
(计算东西时,就用“ $ ( ( 运算内容 ) ) ”来进行计算)
7.变量设置的三个常见问题 :
1.变量的设置以一个 = (等于号)来进行设置
2.= 两边不能有空格(是初学者常犯的问题)!!!
3.只能是英文和数字,且开头不能是数字
8.单引号与双引号的问题:
1.单引号内的东西是什么就是什么,仅为一般字符
2.双引号内的东西代表的是什么就是什么,保留原有属性
9.脚本的追踪与调试:
1.sh -n ***.sh 检测是否有语法问题,若没有,什么也不输出
2.sh -x ***.sh 将脚本执行过程列出来(等价于gdb 中的step 命令了)。如图:(+号后面的就是命令串)