Shell脚本工作方式
- 交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
编写简单的脚本

第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本
第二行的注释信息(#)是对脚本功能和某些命令的介绍信息
第三、四行的可执行语句也就是我们平时执行的Linux命令了接收用户参数
$0对应的是当前Shell脚本程序的名称
$#对应的是总共有几个参数
$*对应的是所有位置的参数值
$?对应的是显示上一次命令的执行返回值
$1、$2、$3……则分别对应着第N个位置的参数值
判断用户的参数
测试语句合适:[ 条件表达式 ]
按照测试对象来划分,条件测试语句可以分为4种:文件测试语句;
- 逻辑测试语句;
- 整数值比较语句;
- 字符串比较语句。
文件测试所用的参数
| 运算符 | 作用 |
|---|---|
| -d | 测试文件是否为目录类型 |
| -e | 测试文件是否存在 |
| -f | 判断是否为一般文件 |
| -r | 测试当前用户是否有权限读取 |
| -w | 测试当前用户是否有权限写入 |
| -x | 测试当前用户是否有权限执行 |
使用文件测试语句来判断是否为一个目录类型的文件,然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在
在Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断文件是否存在,若存在则输出Exist字样。
除了逻辑“与”外,还有逻辑“或”,它在Linux系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量USER来判断当前登录的用户是否为非管理员身份
第三种逻辑语句是“非”,在Linux系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的。
可用的整数比较运算符
| 运算符 | 作用 |
|---|---|
| -eq | 是否等于 |
| -ne | 是否不等于 |
| -gt | 是否大于 |
| -lt | 是否小于 |
| -le | 是否等于或小于 |
| -ge | 是否大于或等于 |

先使用free -m命令查看内存使用量情况(单位为MB),
然后通过grep Mem:命令过滤出剩余内存量的行,
再用awk ‘{print $4}’命令只保留第四列,
最后用FreeMem=语句的方式把语句内执行的结果赋值给变量。
内存小于1024主动提示内存不足
[root@node-1 ~]# [ $FreeMem -lt 1024 ] && echo "内存不足"内存不足
常见的字符串比较运算符
| 运算符 | 作用 |
|---|---|
| = | 比较字符串内容是否相同 |
| != | 比较字符串内容是否不同 |
| -z | 判断字符串内容是否为空 |
流程控制语句
if条件测试语句
单分支的if语句

双分支的if语句

检查主机是否在线的脚本
多分支的if语句

在Linux系统中,read是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量,-p参数用于向用户显示一定的提示信息。
for条件循环语句
for循环语句的语法格式
for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句再适合不过了。
将成绩写到一个文件里面,可以批量的判断
#!/bin/bashread -p "输入成绩单:" FILEfor info in `cat $FILE`doGRADE=${info#*:}if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; thenecho "$info is Good" >> result.txtelif [ $GRADE -ge 60 ] && [ $GRADE -le 84 ] ; thenecho "$info just soso" >> result.txtelif [ $GRADE -ge 0 ] && [ $GRADE -le 59 ] ; thenecho "$info is Fail" >> result.txtelseecho "$info info error" >> result.txtfidoneecho "运行完毕!"
将主机IP地址写到一个文件里面,可以批量的检测是否在线
#!/bin/bashread -p "输入要检测的主机列表文件:" FILEfor HOSTIP in `cat $FILE`doping -c 3 -i 0.2 -W 3 $HOSTIP &> /dev/nullif [ $? -eq 0 ]thenecho "$HOSTIP Online!" >> result.txtelseecho "$HOSTIP Offline!" >> result.txtfidoneecho "运行完毕!"
while条件循环语句
while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数
while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。
while循环语句的语法格式

猜数字游戏
#!/bin/bashPRICE=$(expr $RANDOM % 1000)TIME=0echo "猜一下价格,在0~999之间"while truedoread -p "输入你猜的数字:" INTlet TIME++if [ $INT -gt $PRICE ] ; thenecho "你猜大了"elif [ $INT -lt $PRICE ] ; thenecho "你猜小了"elseecho "你猜对了"echo "你总共猜了$TIME次"exit 0fidone
case条件测试语句
case条件测试语句的语法结构

可以识别用户输入是否合法的猜数字
#!/bin/bashguess () {if [ $INT -gt $PRICE ] ; thenecho "你猜大了"elif [ $INT -lt $PRICE ] ; thenecho "你猜小了"elseecho "你猜对了"echo "你总共猜了$1次"exit 0fi}PRICE=$(expr $RANDOM % 1000)echo "猜一下价格,在0~999之间"TIMES=0while truedoread -p "输入你猜的数字:" INTlet TIMES++case $INT in[a-z]|[A-Z])echo "你输入的是字母";;[0-9]*)guess $TIMS;;*)echo "你输入了错误的字符"esacdone
计划任务
计划任务分为一次性计划任务与长期性计划任务
[root@node-1 ~]# at 23:00at> systemctl restart httpdat> <EOT>job 2 at Thu Apr 11 23:00:00 2019[root@node-1 ~]# echo "systemctl restart httpd" | at 23:00job 3 at Thu Apr 11 23:00:00 2019
查看任务
[root@node-1 ~]# at -l2 Thu Apr 11 23:00:00 2019 a root3 Thu Apr 11 23:00:00 2019 a root
删除任务
[root@node-1 ~]# atrm 2[root@node-1 ~]# at -l3 Thu Apr 11 23:00:00 2019 a root
长期性计划任务
常用命令
| 运算符 | 作用 |
|---|---|
| crontab -l | 查看当前计划任务 |
| crontab -e | 编辑计划任务,可以加上-u参数来编辑其它用户的crontab |
| crontab -r | 删除某条计划任务 |
使用crond设置任务的参数格式

使用crond设置任务的参数字段说明
| 字段 | 说明 |
|---|---|
| 分 | 取值为0~59的整数 |
| 时 | 取值为0~23的任意整数 |
| 日 | 取值为1~31的任意整数 |
| 月 | 取值为1~12的任意整数 |
| 星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
| 命令 | 要执行的命令或程序脚本 |
每份星期1,3,5早上3点25分备份网站
注意事项
- 所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用whereis命令进行查询
- 在crond服务的配置参数中,可以像Shell脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
- 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。
