天天看点

Shell脚本的if条件语句和case语句

Shell脚本的语句

一 条件测试操作

1,1 test命令

测试表达式是否成立,若成立返回0,否则返回其它数值

格式1:test 条件表达式
格式2:[ 条件表达式 ]   (至少应有一个空格)
           

例如:

[[email protected] ~]# touch aa
[[email protected] ~]# ls -lh
           
Shell脚本的if条件语句和case语句
[[email protected] ~]# test -f aa
[[email protected] ~]# echo $?
0                                       返回0表示条件成立
[[email protected] ~]# test -d aa
[[email protected] ~]# echo $?
1                                      返回1表示条件不成立
[[email protected] ~]# [ -f aa ]
[[email protected] ~]# echo $?
0
           
Shell脚本的if条件语句和case语句

1.2 文件测试

[ 操作符 文件或目录 ]
           

1.2.1 常用的测试操作符

-d :测试是否为目录(Directory)
-e :测试目录或文件是否存在(Exist)
-f : 测试是否为文件(File)
-r : 测试当前用户是否有权限读取(Read)
-w :测试当前用户是否有权限写入 (Write)
-x :测试当前用户是否有权限执行 (eXcute)
           

例如:

[[email protected] ~]# [ -d aa ]
[[email protected] ~]# echo $?
1
[[email protected] ~]# [ -e aa ]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [ -r aa ]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [ -w aa ]
[[email protected] ~]# echo $?
0
[[email protected] ~]# [ -x aa ]
[[email protected] ~]# echo $?
           
Shell脚本的if条件语句和case语句
&&:逻辑与,而且意思(做一个条件判断,前面条件成立,才会输出;不成立,就不输出)
[[email protected] ~]# [ -x aa ] && echo "this file has x permission"
[[email protected] ~]# chmod +x aa
[[email protected] ~]# [ -x aa ] && echo "this file has x permission"
this file has x permission
[[email protected] ~]# chmod -x aa
[[email protected] ~]# [ -x aa ] || echo "this file has x permission"
this file has x permission
||:或,一个条件成立即可
           
Shell脚本的if条件语句和case语句

1.3 整数值比较

[ 整数1 操作符 整数2 ]
           

条件判断的前提条件,必须是整数

1.3.1 常用的测试操作符

-eq:等于(Equal)
-ne :不等于 (Not Equal)
-gt:大于 (Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于 (Lesser or Equal)
-ge:大于或等于 (Greater or Equal)
           

循环条件:20次

i=0 i<=19或i<20

i=1 i<=20或i<21

例如:

[[email protected] ~]# who
[[email protected] ~]# who | wc -l    条件判断先取值
5
[[email protected] ~]# [ $(who | wc -l) -ge 4 ] && echo "too many."
too many.          用户数大于等于4               
[[email protected] ~]# [ $(who | wc -l) -lt 4 ] && echo "too many."
           
Shell脚本的if条件语句和case语句
[[email protected] ~]# free -m                     可用内存容量
                  total        used        free      shared  buff/cache   available 可用
Mem:           1823        1229          80          13         513         347
Swap:          3071          28        3043
[[email protected] ~]# free -m | grep Mem:
Mem:           1823        1229          80          13         513         347
[[email protected] ~]# free -m | grep Mem: | awk '{print $7}'   做哪个字段的输出第7位  
347
[[email protected] ~]# echo $(free -m | grep Mem: | awk '{print $7}')   首先保证可以输出
346
[[email protected] ~]# [ $(free -m | grep Mem: | awk '{print $7}') -le 1024 ] && echo "内存可用空间:$(free -m | grep Mem: | awk '{print $7}') MB"    内存可用空间是否小于等于1024MB
内存可用空间:346 MB
           
Shell脚本的if条件语句和case语句

1.4 字符串比较:

格式1:[ 字符串1 = 字符串2 ]
      [ 字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]
           

1.4.1 常用的测试操作符

=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空
           

例如:

[[email protected] ~]# [ 'b' = 'c' ]
[[email protected] ~]# echo $?
1
[[email protected] ~]# [ 'b' = 'c' ] && echo "b不等于c"
[[email protected] ~]# [ 'b' != 'c' ] && echo "b不等于c"
b不等于c
[[email protected] ~]# [ -z '' ] && echo "空的"
空的
           
Shell脚本的if条件语句和case语句
[[email protected] ~]# read -p "是否覆盖现有内容?(yes/no)" ack
是否覆盖现有内容?(yes/no)yes
[[email protected] ~]# [ $ack = "yes" ] && echo "覆盖"
覆盖
[[email protected] ~]# 
[[email protected] ~]# [ $ack = "no" ] && echo "不覆盖"
[[email protected] ~]# read -p "是否覆盖现有内容?(yes/no)" ack
是否覆盖现有内容?(yes/no)no
[[email protected] ~]# [ $ack = "no" ] && echo "不覆盖"
不覆盖
           
Shell脚本的if条件语句和case语句

1.5 逻辑测试

格式1:[ 表达式1 ] 操作符  [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ....
           

1.5.1 常用的测试操作符

-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否
           

二 if语句

2.1 单分支结构 (单一情况)

if 条件测试操作                   if 已用磁盘空间>80%
then 命令序列                     then  报警
fi                                fi
           

在这里插入图片描述

例如:

1.针对目录模拟

[[email protected] ~]# vi mkdir.sh
[[email protected] ~]# chmod +x mkdir.sh
[[email protected] ~]# ./mkdir.sh
[[email protected] ~]# ls -R /a
[[email protected] ~]# cd /
[[email protected] /]# ls -lh

#!/bin/bash       查看目录是否存在,不存在就创建目录
# 创建目录
dir="/a/b"    做判断是否存在
if [ ! -d $dir ]  
then mkdir -p $dir
fi
           
Shell脚本的if条件语句和case语句

2.针对用户模拟

[[email protected] ~]# echo $USER    
root
[[email protected] ~]# su zjq
[[email protected] root]$ sudo vi a.sh
[[email protected] root]$ sudo chmod +x a.sh
[[email protected] root]$ sudo ./a/sh


#!/bin/bash
# 判断当前用户是否为root       查看当前用户是否是root,不是报错
if [ ! “$USER” =  “root” ]
then echo "当前用户不是root"
fi
           
Shell脚本的if条件语句和case语句

2.2 双分支结构(正反两种情况)

if 条件测试操作                   if  80端口是否在监听
then 命令序列1                     then  网站服务已在运行
else 命令序列2                     else 启动httpd服务
fi                                fi
           
Shell脚本的if条件语句和case语句

1.查看80端口是否开启

[[email protected] ~]# netstat -anpt | grep 80
tcp        0      0 20.0.0.11:22            20.0.0.1:50080          ESTABLISHED 61372/sshd: [email protected] 
[[email protected] ~]# echo $?
0
           
Shell脚本的if条件语句和case语句
[[email protected] ~]# vi s1.sh
[[email protected] ~]# chmod +x s1.sh
[[email protected] ~]# ./s1.sh


#!/bin/bash
# 判断apache是否启动中
netstat -anpt | grep 80
if [ $? = 0 ]
then echo "网络服务正在运行"
else echo "网站服务停止"
fi
           
Shell脚本的if条件语句和case语句

2.地址通信查看

[[email protected] ~]# ping 20.0.0.10
[[email protected] ~]# echo $?
0
[[email protected] ~]# ping 20.0.0.15
[[email protected] ~]# echo $?
           
Shell脚本的if条件语句和case语句
[[email protected] ~]# vi ping.sh
[[email protected] ~]# chmod +x ping.sh
[[email protected] ~]# ./ping.sh 20.0.0.10
20.0.0.10 is up.
[[email protected] ~]# ./ping.sh 20.0.0.15
20.0.0.15 is down.
           
Shell脚本的if条件语句和case语句
#!/bin/bash
ping -c 3 $1 &> /dev/null
if [ $? = 0 ]
then echo "$1 is up."
else echo "$1 is down."
fi
           
Shell脚本的if条件语句和case语句

3.天气好坏分类

[[email protected] ~]# vi tianqi.sh
[[email protected] ~]# chmod +x tianqi.sh
[[email protected] ~]# ./tianqi.sh
天气天晴
好天气
[[email protected] ~]# ./tianqi.sh
天气阴天
今天可能需要带伞

#!/bin/bash
# 天气

read -p "天气" weather
if [ "$weather" = "天晴" ]
then echo "好天气"
else echo "今天可能需要带伞"
fi
           
Shell脚本的if条件语句和case语句

2.3 多分支结构

if 条件测试操作1                   if  分数为85-100之间
then 命令序列1                     then  判为优秀
elif 条件测试操作2                  elif的 分数为70-84之间
then 命令序列2  then 发             then  判为合格
else                                esle
命令序列3                            判为不合格
 fi                                     fi
           
Shell脚本的if条件语句和case语句

1.成绩查询

[[email protected] ~]# vi grade.sh
[[email protected] ~]# chmod +x grade.sh
[[email protected] ~]# ./grade.sh
           
Shell脚本的if条件语句和case语句
#!/bin/bash
# 成绩判断
read -p "您的成绩为:" grade
if [ $grade -gt 100 ] || [ $grade -lt 0 ]
then echo "输入错误,请重新输入0-100之间的数值"
elif [ $grade -ge 85 ] && [ $grade -le 100 ]
then echo "优秀!!!"
elif [ $grade -ge 70 ] && [ $grade -le 84 ]
then echo "良好!!!"
elif [ $grade -ge 60 ] && [ $grade -le 69 ]
then echo "合格!!!"
else echo "不合格!!!"
fi
           
Shell脚本的if条件语句和case语句

2.3.1提取性能监控指标项目(磁盘占用,CPU使用,内存使用)

1,磁盘占用情况

[[email protected] ~]# df -Th
[[email protected] ~]# df -Th | grep "/$"
[[email protected] ~]# df -Th | grep "/$" | awk '{print $6}'
[[email protected] ~]# df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}'
[[email protected] ~]# disk=$( df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
[[email protected] ~]# [ $disk -gt 10 ] && echo "too less."
[[email protected] ~]# [ $disk -lt 10 ] && echo "too less."
           
Shell脚本的if条件语句和case语句

2,内存占用情况

[[email protected] ~]# free
[[email protected] ~]# free | grep "Mem:" | awk '{print $3}'
[[email protected] ~]# free | grep "Mem:" | awk '{print $2}'
[[email protected] ~]# expr $(free | grep "Mem:" | awk '{print $3}') / $(free | grep "Mem:" | awk '{print $2}')
[[email protected] ~]# expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}')
[[email protected] ~]# echo $(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
[[email protected] ~]# mem=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
           
Shell脚本的if条件语句和case语句

3,CPU占用率

[[email protected] ~]# mpstat
[[email protected] ~]# mpstat | tail -1 | awk '{print $12}'
[[email protected] ~]# mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'
[[email protected] ~]# expr 100 - $( mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}')
           
Shell脚本的if条件语句和case语句

4.准备配置数据

disk=$( df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')     
mem=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
cpu=$(expr 100 - $( mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
if [ $disk -ge 85 ] then echo "磁盘占有率超过85%"
if [ $mem -ge 90 ] then echo "内存占有率超过90%"
if [ $cpu -ge 90 ] then echo "cpu占有率超过90%"
           

5.发送报警邮件

[[email protected] ~]# rpm -qa mailx   查看是否安装程序
[[email protected] ~]# vi /etc/mail.rc   配置文件
[[email protected] ~]# echo "123456" | mail -s "test" [email protected]
发送邮件,内容:123456
           
Shell脚本的if条件语句和case语句
set [email protected]  发送邮箱地址
set smtp=smtp.qq.com       邮箱使用的smtp服务器的域名
set [email protected]  smtp邮件发送时登录的账号
set smtp-auth-password=........    授权码
set smtp-auth=login           smtp的状态,登录状态
           

6.查看是否可以上网,发送邮件

登录邮箱查看邮件

Shell脚本的if条件语句和case语句

7.进行报警文件测试

[[email protected] ~]# vim alert.sh    
[[email protected] ~]# chmod +x alert.sh
[[email protected] ~]# ./alert.sh
           
Shell脚本的if条件语句和case语句
1 #!/bin/bash
  2 # 硬件巡检,对cpu,内存,磁盘超过阀值报警
  3 disk=$( df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
  4 mem=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
  5 cpu=$(expr 100 - $( mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
  6 alert_file=/root/alert.txt
  7 [email protected]
  8 if [ $disk -ge 10 ]
  9 then echo "磁盘占有率超过85%" >> $alert_file
 10 fi
 11 if [ $mem -ge 5 ]
 12 then echo "内存占有率超过90%" >> $alert_file
 13 fi
 14 if [ $cpu -ge 2 ]
 15 then echo "cpu占有率超过90%" >> $alert_file
 16 fi
 17 if [ -f $alert_file ]
 18 then
 19 cat $alert_file | mail -s "alert report" $mailbox
 20 rm -rf $alert_file
 21 fi
           
Shell脚本的if条件语句和case语句

进入邮箱看出报警信息

Shell脚本的if条件语句和case语句

三 case语句结构

3.1 case多分支结构

case  变量值 in                     case 分数  in
模式1)                              85-100)
命令序列1                             判为优秀
;;                                   ; ;
模式2)                               70-84)
命令序列2                            判为合格
; ;                                  ; ;
....                                   ......
*)                                   *)
默认命令序列                         判为不合格
esac                                   esac
           

3.2 case语句应用示例

case多分支语句

[email protected] #cathitkey.sh
#!/bin/bash
read -p "请输入-个字符,并按Enter键确认:" KEY
case "$KEY" in                 
[a-z][A-Z])                                   匹配任意字母
echo "您输入的是字母."
      ;;
[0-9])                                          匹配任意数字
echo "您输入的是数字."
     ;;
*)                                              匹配任意字符
echo "您输入的是空格、功能键或其他控制字符. " 
esac
           

例如:

[[email protected] ~]# vi case.sh
[[email protected] ~]# chmod +x case.sh
[[email protected] ~]# ./case.sh




#!/bin/bash
# 判断输入的字符是哪种类型
read -p "请输入一个字符并按enter回车确认" key
case "$key" in
    [a-z]|[A-Z])                   匹配任意字母
         echo "您输入的是字母."    
      ;;
    [0-9])                            匹配任意数字
         echo "您输入的是数字."
      ;;     
     *)                                  匹配任意字符 
         echo "您输入的是空格,功能键,其它控制字符." 
exit 1
esac
           
Shell脚本的if条件语句和case语句
Shell脚本的if条件语句和case语句

成绩分类判断

[[email protected] ~]# vi case2.sh
[[email protected] ~]# chmod +x case2.sh
[[email protected] ~]# ./case2.sh

#!/bin/bash
# 成绩输入判断
read -p "成绩:" b
case "$b" in
     100)
      echo "满分"
   ;;
   9[0-9])
      echo "优秀"
   ;;
  8[0-9])
      echo "良"
   ;;
  7[0-9])
      echo "良好"
   ;;
  6[0-9])
      echo "合格"
   ;;
   *)
      echo "不及格"
esac
           
Shell脚本的if条件语句和case语句
Shell脚本的if条件语句和case语句

继续阅读