学习Linux有一段时间了,在学习了部分Linux命令、正则表达式以及shell指令后,开始尝试shell脚本的练习。 (第一次写博客,写的不好多多包涵!)
一.编写脚本
打开MobaXterm编辑器,连上主机后新建一个shell文件employee.sh,输入如下代码:
#!/bin/bash
# This shell is used to calculate how long you can be a formal worker!
read -p "Please input the date you can be a formal worker :" date1
#测试一下输入内容是否正确,利用正则表达式
date_d=$(echo ${date1} |grep '[0-9]\{8\}') #看看是否有八个数字
if [ "${date_d}" == "" ]; then
echo "You input the wrong date format.... "
exit 1
fi
#开始计算日期
declare -i date_for=$(date --date="${date1}" +%s) #转正日期秒数
declare -i date_now=$(date +%s) #现在日期秒数
declare -i date_total=$((${date_for}-${date_now})) #剩余秒数统计
declare -i date_d=$((${date_total}/60/60/24)) #转为日数
if [ "${date_total}" -lt "0" ]; then #判断是否已转正
echo "You had been a formal worker for " $((-1*${date_d})) "days"
else
declare -i date_h=$(( $(( ${date_total}-${date_d}*60*60*24 )) /60/60 ))
echo "You will be a formal worker after ${date_d} days and ${date_h} hours."
fi
二.执行方法
执行方法1:
chmod +x ./employee.sh #使脚本具有执行权限
./employee.sh #执行脚本
执行方法2:
sh employee.sh
三.调试
语法检查
-n选项只做语法检查,而不执行脚本
sh -n employee.sh
启动调试
sh -x employee.sh
进入调试模式后,shell依次执行读入的语句
中断调试
在调试过程中可以按Ctrl + Z中断调试,观察结果,然后再按fg键继续调试即可。
四.解释说明
read -p 从键盘输入中读取变量,类似于echo的作用,它的另一种方式是echo+说明 ;read+变量 ;
$ {date1} 引用date1这个变量,{}可以不加,不过为了使你的代码更加规范最好加上;
| 管道符,将符号前面命令的结果丢给符号后面的命令;
\ 脱义字符,因为{}在shell中有特殊含义,所以需使用 \ 将其转换为普通字符;
grep ‘[0-9]\ {8\ }’ 取8个数字;
date 获得当前系统时间,date --date="${date1}" +%s则是获得date1的时间,+%s是将其转为秒。date的详细用法可参考此文章;
关于shell里面的除法,得到的结果是整数;
shell里面的数学运算要使用双括号 (());
if 条件判断,可以使用((判断条件)),这种情况里面的条件判断符可以使用<、>等符号,也可以使用[ ],但是就不能使用<、>等符号了,要使用 -lt 表示小于这种格式;
五.错误诊断
1.Linux使用vim出现E325:ATTENTION错误
这是由于在编辑该文件的时异常退出,而vim在编辑文件时会创建一个交换文件swap file以保证文件的安全性。所以在再每次打开这个文件都会出现这个警告,为了去掉这个警告,我们只需要删除这个swap文件即可。该swap文件是隐藏的,我们可以通过ls –la命令查看到。使用rm命令进行删除即可。
2.syntax error near unexpected token `('
这个是因为在引用变量时$与(之间不能有空格。
3.中括号[ ]的使用
在中括号[ ]内的每个组件都要用空格来分隔;
在中括号内的变量,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来;