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/bash
read -p "输入成绩单:" FILE
for info in `cat $FILE`
do
GRADE=${info#*:}
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$info is Good" >> result.txt
elif [ $GRADE -ge 60 ] && [ $GRADE -le 84 ] ; then
echo "$info just soso" >> result.txt
elif [ $GRADE -ge 0 ] && [ $GRADE -le 59 ] ; then
echo "$info is Fail" >> result.txt
else
echo "$info info error" >> result.txt
fi
done
echo "运行完毕!"
将主机IP地址写到一个文件里面,可以批量的检测是否在线
#!/bin/bash
read -p "输入要检测的主机列表文件:" FILE
for HOSTIP in `cat $FILE`
do
ping -c 3 -i 0.2 -W 3 $HOSTIP &> /dev/null
if [ $? -eq 0 ]
then
echo "$HOSTIP Online!" >> result.txt
else
echo "$HOSTIP Offline!" >> result.txt
fi
done
echo "运行完毕!"
while条件循环语句
while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数
while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。
while循环语句的语法格式
猜数字游戏
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIME=0
echo "猜一下价格,在0~999之间"
while true
do
read -p "输入你猜的数字:" INT
let TIME++
if [ $INT -gt $PRICE ] ; then
echo "你猜大了"
elif [ $INT -lt $PRICE ] ; then
echo "你猜小了"
else
echo "你猜对了"
echo "你总共猜了$TIME次"
exit 0
fi
done
case条件测试语句
case条件测试语句的语法结构
可以识别用户输入是否合法的猜数字
#!/bin/bash
guess () {
if [ $INT -gt $PRICE ] ; then
echo "你猜大了"
elif [ $INT -lt $PRICE ] ; then
echo "你猜小了"
else
echo "你猜对了"
echo "你总共猜了$1次"
exit 0
fi
}
PRICE=$(expr $RANDOM % 1000)
echo "猜一下价格,在0~999之间"
TIMES=0
while true
do
read -p "输入你猜的数字:" INT
let TIMES++
case $INT in
[a-z]|[A-Z])
echo "你输入的是字母"
;;
[0-9]*)
guess $TIMS
;;
*)
echo "你输入了错误的字符"
esac
done
计划任务
计划任务分为一次性计划任务与长期性计划任务
[root@node-1 ~]# at 23:00
at> systemctl restart httpd
at> <EOT>
job 2 at Thu Apr 11 23:00:00 2019
[root@node-1 ~]# echo "systemctl restart httpd" | at 23:00
job 3 at Thu Apr 11 23:00:00 2019
查看任务
[root@node-1 ~]# at -l
2 Thu Apr 11 23:00:00 2019 a root
3 Thu Apr 11 23:00:00 2019 a root
删除任务
[root@node-1 ~]# atrm 2
[root@node-1 ~]# at -l
3 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脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
- 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。