Shell脚本工作方式

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

    编写简单的脚本

    录制_2019_04_10_10_02_19_946.gif
    第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本
    第二行的注释信息(#)是对脚本功能和某些命令的介绍信息
    第三、四行的可执行语句也就是我们平时执行的Linux命令了

    接收用户参数

    $0对应的是当前Shell脚本程序的名称
    $#对应的是总共有几个参数
    $*对应的是所有位置的参数值
    $?对应的是显示上一次命令的执行返回值
    $1、$2、$3……则分别对应着第N个位置的参数值
    录制_2019_04_10_10_05_41_748.gif

    判断用户的参数

    测试语句合适:[ 条件表达式 ]
    按照测试对象来划分,条件测试语句可以分为4种:

  • 文件测试语句;

  • 逻辑测试语句;
  • 整数值比较语句;
  • 字符串比较语句。

文件测试所用的参数

运算符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

使用文件测试语句来判断是否为一个目录类型的文件,然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在
录制_2019_04_10_10_14_13_585.gif
在Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断文件是否存在,若存在则输出Exist字样。
录制_2019_04_10_10_15_37_629.gif
除了逻辑“与”外,还有逻辑“或”,它在Linux系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量USER来判断当前登录的用户是否为非管理员身份
录制_2019_04_10_10_16_59_171.gif
第三种逻辑语句是“非”,在Linux系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的。
录制_2019_04_10_10_18_07_280.gif
可用的整数比较运算符

运算符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于

录制_2019_04_10_10_21_23_718.gif
先使用free -m命令查看内存使用量情况(单位为MB),
然后通过grep Mem:命令过滤出剩余内存量的行,
再用awk ‘{print $4}’命令只保留第四列,
最后用FreeMem=语句的方式把语句内执行的结果赋值给变量。
录制_2019_04_10_10_23_25_866.gif
内存小于1024主动提示内存不足

  1. [root@node-1 ~]# [ $FreeMem -lt 1024 ] && echo "内存不足"
  2. 内存不足

常见的字符串比较运算符

运算符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空

流程控制语句

if条件测试语句

单分支的if语句
image.png
录制_2019_04_10_11_00_53_774.gif
双分支的if语句
image.png
检查主机是否在线的脚本
录制_2019_04_10_11_09_21_38.gif
多分支的if语句
image.png
在Linux系统中,read是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量,-p参数用于向用户显示一定的提示信息。
录制_2019_04_10_11_51_55_842.gif

for条件循环语句

for循环语句的语法格式
image.png
for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句再适合不过了。

将成绩写到一个文件里面,可以批量的判断
录制_2019_04_11_10_31_11_138.gif

  1. #!/bin/bash
  2. read -p "输入成绩单:" FILE
  3. for info in `cat $FILE`
  4. do
  5. GRADE=${info#*:}
  6. if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
  7. echo "$info is Good" >> result.txt
  8. elif [ $GRADE -ge 60 ] && [ $GRADE -le 84 ] ; then
  9. echo "$info just soso" >> result.txt
  10. elif [ $GRADE -ge 0 ] && [ $GRADE -le 59 ] ; then
  11. echo "$info is Fail" >> result.txt
  12. else
  13. echo "$info info error" >> result.txt
  14. fi
  15. done
  16. echo "运行完毕!"

将主机IP地址写到一个文件里面,可以批量的检测是否在线
录制_2019_04_11_10_45_36_889.gif

  1. #!/bin/bash
  2. read -p "输入要检测的主机列表文件:" FILE
  3. for HOSTIP in `cat $FILE`
  4. do
  5. ping -c 3 -i 0.2 -W 3 $HOSTIP &> /dev/null
  6. if [ $? -eq 0 ]
  7. then
  8. echo "$HOSTIP Online!" >> result.txt
  9. else
  10. echo "$HOSTIP Offline!" >> result.txt
  11. fi
  12. done
  13. echo "运行完毕!"

while条件循环语句

while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数
while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。

while循环语句的语法格式
image.png

猜数字游戏
录制_2019_04_11_15_56_05_238.gif

  1. #!/bin/bash
  2. PRICE=$(expr $RANDOM % 1000)
  3. TIME=0
  4. echo "猜一下价格,在0~999之间"
  5. while true
  6. do
  7. read -p "输入你猜的数字:" INT
  8. let TIME++
  9. if [ $INT -gt $PRICE ] ; then
  10. echo "你猜大了"
  11. elif [ $INT -lt $PRICE ] ; then
  12. echo "你猜小了"
  13. else
  14. echo "你猜对了"
  15. echo "你总共猜了$TIME次"
  16. exit 0
  17. fi
  18. done

case条件测试语句

case条件测试语句的语法结构
image.png

可以识别用户输入是否合法的猜数字
录制_2019_04_11_16_36_54_183.gif

  1. #!/bin/bash
  2. guess () {
  3. if [ $INT -gt $PRICE ] ; then
  4. echo "你猜大了"
  5. elif [ $INT -lt $PRICE ] ; then
  6. echo "你猜小了"
  7. else
  8. echo "你猜对了"
  9. echo "你总共猜了$1次"
  10. exit 0
  11. fi
  12. }
  13. PRICE=$(expr $RANDOM % 1000)
  14. echo "猜一下价格,在0~999之间"
  15. TIMES=0
  16. while true
  17. do
  18. read -p "输入你猜的数字:" INT
  19. let TIMES++
  20. case $INT in
  21. [a-z]|[A-Z])
  22. echo "你输入的是字母"
  23. ;;
  24. [0-9]*)
  25. guess $TIMS
  26. ;;
  27. *)
  28. echo "你输入了错误的字符"
  29. esac
  30. done

计划任务

计划任务分为一次性计划任务与长期性计划任务

  • 一次性计划任务:今晚11点30分开启网站服务。
  • 长期性计划任务:每周一的凌晨3点25分把/home/wwwroot目录打包备份为backup.tar.gz。

    一次性计划任务

    添加任务
  1. [root@node-1 ~]# at 23:00
  2. at> systemctl restart httpd
  3. at> <EOT>
  4. job 2 at Thu Apr 11 23:00:00 2019
  5. [root@node-1 ~]# echo "systemctl restart httpd" | at 23:00
  6. job 3 at Thu Apr 11 23:00:00 2019

查看任务

  1. [root@node-1 ~]# at -l
  2. 2 Thu Apr 11 23:00:00 2019 a root
  3. 3 Thu Apr 11 23:00:00 2019 a root

删除任务

  1. [root@node-1 ~]# atrm 2
  2. [root@node-1 ~]# at -l
  3. 3 Thu Apr 11 23:00:00 2019 a root

长期性计划任务

常用命令

运算符 作用
crontab -l 查看当前计划任务
crontab -e 编辑计划任务,可以加上-u参数来编辑其它用户的crontab
crontab -r 删除某条计划任务

使用crond设置任务的参数格式
image.png
使用crond设置任务的参数字段说明

字段 说明
取值为0~59的整数
取值为0~23的任意整数
取值为1~31的任意整数
取值为1~12的任意整数
星期 取值为0~7的任意整数,其中0与7均为星期日
命令 要执行的命令或程序脚本

每份星期1,3,5早上3点25分备份网站
录制_2019_04_11_17_01_46_21.gif
注意事项

  • 所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用whereis命令进行查询
  • 在crond服务的配置参数中,可以像Shell脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
  • 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。