一.条件测试

1.对字符串进行测试

语法格式1, test 表达式 2, [ 表达式 ]

== 两边是否相等,相等时条件测试算成功 != 两边是否不等,不相等时条件测试算成功

  1. test a == a //方式一:test ,使用常量判断,再用echo $?测试结果
  2. test a == b
  3. [ a == a ] //方式二:中括号,使用常量判断,再用echo $?测试结果
  4. [ a == b ]
  5. a=abc
  6. b=xyz
  7. [ $a == $b ] //使用变量判断两个变量的值是否相等
  8. [ $a != $b ] //使用变量判断两个变量的值是否不相等
  9. [ "$c" == $b ] //如果变量为空,有可能报错,加双引号可以避免
  10. -z
  11. [ -z $a ] //判断变量是否为空,为空时条件测试算成功
  12. [ ! -z $a ] //判断变量是否非空,非空时条件测试算成功

2.逻辑组合

条件 && 指令 条件成功才执行指令
条件 || 指令 条件失败才执行指令

  1. [ root == $USER ] || exit //判断当前用户名是否为root
  2. 如果判断失败,则执行exit
  3. [ $USER != root ] && exit //判断当前用户名是否不为root
  4. 如果判断成功,则执行exit
  5. 当多个逻辑符号组合使用时
  6. A && B AB任务都成功算成功
  7. A || B AB 任务有一个成功算成功
  8. touch a b c
  9. ls a && ls b && ls c //结果是都显示
  10. ls a || ls b || ls c //结果是显示a
  11. ls a && ls b || ls c //结果是显示a和b
  12. ls a || ls b && ls c //结果是显示a和c
  13. [ root != $USER ] && echo "非管理员不能执行该脚本" && exit //之前的语句可以改进成这个方式

3.数字

-eq 是否相等 -ne 是否不等 -gt 是否大于

-ge 是否大于等于 -lt 是否小于 -le 是否小于等于

-eq (Equal) -ne (Not Equal) -ge (Greater or Equal) -le (Less or Equal) -gt (Greater Than)

-lt (Less Than)

  1. 编写脚本,每2分钟检查服务器的用户数量,如果发生变化则发邮件通知管理员
  2. yum -y install mailx postfix //安装邮件客户端软件和服务端程序
  3. systemctl restart postfix //启动邮件服务
  4. 如果改过主机名,需要将在/etc/hosts文件第二行的末尾加空格主机名
  5. echo "测试" | mail -s test root //编写脚本前,测试下邮件功能是否正常 ,mail -s是发送邮件,test是标题,root是给谁发,echo后面写要发送的邮件内容
  6. 使用上述命令发邮件,再敲mail命令打开邮件列表即可看到邮件,按邮件列表对应的数字回车可以查看邮件内容,q是退出
  7. 如果邮件太多可以删除/var/spool/mail/root文件清空邮箱
  8. #!/bin/bash
  9. x=$(cat /etc/passwd | wc -l) //将目前用户数量赋值给变量x
  10. [ $x -gt 29 ] && echo "用户数量发生变化,服务器可能被入侵" | mail -s test root //如果目前用户数量大于29,就发邮件给管理员,29是之前查看的用户数量
  11. ----------------------------------------------------
  12. chmod u+x test01.sh //然后给脚本加x权限
  13. crontab -e //编写计划任务
  14. */2 * * * * /opt/test01.sh //定义每2分钟执行脚本

4.文件

-e 判断文件是否存在,不关心类型 -f 判断文件是否存在,必须是普通文件 -d 判断文件是否存在,必须是目录 -r 判断当前用户对文件是否有读权限,对root无效 -w 判断当前用户对文件是否有写权限,对root无效 -x 判断当前用户对文件是否有x权限 [ -e abc ] //判断当前目录下的abc是否存在,用echo $?查结果 [ -f /opt/abc ] //判断opt下有没有abc这个普通文件 [ -d /opt/abc ] //判断opt下有没有abc这个目录 mkdir xyz [ -d /opt/xyz ] //判断opt下有没有xyz这个目录 [ -r /opt/abc ] //判断当前用户对abc是否有读权限 [ -w /opt/abc ] //判断当前用户对abc是否有写权限 [ -x /opt/abc ] //判断当前用户对abc是否有x权限

== != -z ! -z && || -eq -ne -gt -ge -lt -le -e -f -d -r -w -x

二. if分支

1.单分支 格式

if 条件测试;then //满足条件的话就执行下面指令 执行指令 fi

  1. #!/bin/bash
  2. if [ $UID -eq 0 ];then
  3. echo "我是管理员"
  4. echo ok
  5. fi

2.双分支 格式

if 条件测试;then //满足条件的话就执行下面指令 执行指令A //指令可以是一条,也可以是多条 else //否则,不满足条件的话就执行下面指令 执行指令B fi

  1. #!/bin/bash
  2. if [ $UID -eq 0 ];then
  3. echo "我是管理员"
  4. echo ok
  5. else
  6. echo "我不是管理员"
  7. echo no
  8. fi
  9. ------------------------------------------------
  10. ping -c 3 -i 0.2 -W 1 192.168.2.254 // -c 定义ping的次数 -i 定义ping的间隔时间(秒) -W ping失败时多久反馈结果
  11. -------------------------------------------------
  12. 使用if双分支编写ping脚本
  13. #!/bin/bash
  14. ping -c 3 -i 0.2 -W 1 $1 &> /dev/null //使用$1位置变量
  15. 更方便
  16. if [ $? -eq 0 ];then
  17. echo "通了!"
  18. else
  19. echo "不通!"
  20. fi

3.多分支

if 条件测试;then //满足条件的话就执行下面A指令 执行指令A //指令可以是一条,也可以是多条 elif 条件测试;then //满足条件的话就执行下面B指令 执行指令B elif 条件测试;then //满足条件的话就执行下面C指令 执行指令C else //否则,不满足条件的话就执行下面指令 执行指令 fi

  1. #!/bin/bash
  2. read -p "询问内容" x
  3. if [ $x -eq 1 ];then
  4. echo "情况一"
  5. elif [ $x -eq 2 ];then
  6. echo "情况二"
  7. elif [ $x -eq 3 ];then
  8. echo "情况三"
  9. else
  10. echo "情况四"
  11. fi

三. 循环