云计算运维之Shell条件语句(if 语句+case语句及实例详解)

    科技2024-08-21  23

    通常在云计算运维中,通常会用到shell和python,今天介绍shell当中的if和case语句,来完成测试判断,以减少程序的运行错误。

    目录

    概述一:条件测试1.1:test命令1.2:文件测试 文件类型跟权限测试1.3:整数值比较1.4:字符串比较1.5:逻辑测试 二:if 语句的结构2.1:单分支结构2.2:双分支结构2.3:多分支结构2.4:多分支实例 三:case语句

    概述

      在shell脚本中的各种条件结构和流程控制都要进行各种的测试,然后根据测试的结果执行不同的操作,有时也会和if语句结合,来完成测试判断,以减少程序的运行错误。   也就是说,当我们在写一个脚本,里面没有任何的判断,就写了一些很普通的命令,那么在我们运行脚本的时候,当遇到了错误,也会一直的执行下去,这样就导致了我们脚本执行的结果是错误的。 这时候我们就会用到我们的条件测试比较。 那么在执行条件测试中通常会返回 “真”或者“假”就像我们执行一条成功的命令,那么执行完这条命令 我们echo$? 如果它返回的是0 那么就是真的返回的状态是非0那么就是假的 也就是错的。

    一:条件测试

    1.1:test命令

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

    格式1:test 条件表达式 格式2:【 条件表达式 】 #注意两端要有空格: #文件测试

    1.2:文件测试 文件类型跟权限测试

    [操作符 文件或目录] &? 返回0表示条件成立,返回非零值表示条件不成立 && 逻辑与,"而且"的意思 || 逻辑或,"或者"的意思 常见的测试操作符解释-d测试是否为目录(directory)-e测试目录或文件是否存在(Exist)-f测试是否为文件(File)-r测试当前用户是否有权限读取(Read)-w测试当前用户是否有权限写入(Write)-x测试当前用户是否有权限执行(eXcute) [root@localhost ~]# touch a.txt [root@localhost ~]# test -f a.txt [root@localhost ~]# echo $? 0 [root@localhost ~]# test -d a.txt [root@localhost ~]# echo $? 1 [root@server1 test]# mkdir tom [root@server1 test]# ls tom [root@server1 test]# [ -x /test/tom ] [root@server1 test]# echo $? 0 [root@server1 test]# ll 总用量 0 drwxr-xr-x. 2 root root 6 107 19:31 tom echo $? 查询上个步骤是否成立,成立则为0,不成立则为非0&& 是而且的含义 表示如果两边的条件都成立,才会正确执行;echo "yes"很明显是正确的 [root@server1 test]# [ -e /dev/cdrom ]&& echo "yes" yes [root@server1 test]# test -e /dev/cdrom && echo "yes" yes

    1.3:整数值比较

    整数值比较 命令基本格式 [ 整数1 操作符 整数2 ] 常用的测试操作符 操作符解释-eq等于(Equal)-ne不等于(Not Equal)-gt大于(Greater Than)-lt小于(Lesser Than)-le小于或等于(Lesser or Equal)-ge大于或等于(Greater or Equal) [root@server1 test]# [ -e /dev/cdrom ]&& echo "yes" yes [root@server1 test]# test -e /dev/cdrom && echo "yes" yes [root@server1 test]# [ 33 -eq 33 ] && echo "yes" yes [root@server1 test]# [ 33 = 33 ] && echo "yes" yes [root@server1 test]# [ 33 == 33 ] && echo "yes" yes #数值比较用-eq [root@server1 test]# [ "tom" == "tom" ] && echo "yes" yes [root@server1 test]# [ "tom" -eq "tom" ] && echo "yes" bash: [: tom: 期待整数表达式 #本身不成立的可以取反成立 [root@server1 test]# [ ! "jerry" == "jerryjunior" ] && echo "yes" yes 命令前面加括号或者反撇 [root@server1 test]# [ $(who|wc -l) -lt 3 ]&& echo "Too many." Too many. #who查看当前登录的用户。 #who | wc -l :将who的输出作为wc的输入,wc为统计行数,单词数及字符个数,-l 表示统计行数。

    查看内存信息

    [root@server1 test]# free -m total used free shared buff/cache available Mem: 1823 730 470 18 622 854 Swap: 2047 0 2047 [root@server1 test]# free -m |grep "Mem:" Mem: 1823 730 470 18 622 853 [root@server1 test]# free -m |grep "Mem:"| awk '{print $4}' 470 [root@server1 test]# tom=$(free -m |grep "Mem:"| awk '{print $4}') [root@server1 test]# [ $tom -gt 100 ]&& echo 'tom good' tom good [root@server1 test]# [ $tom -gt 100 ]&& echo "$tom MB" 469 MB [root@server1 test]# [ $tom -gt 100 ]&& echo "$tom"MB 469MB [root@server1 test]# [ $tom -gt 100 ]&& echo ${tom}MB 469MB #$跟大括号表示一个变量'

    1.4:字符串比较

    常用的格式 格式一:[ 字符串1 = 字符串2 ] [ 字符串1= 字符串2 ] 格式二:[ -z 字符串 ] 常用的测试操作符解释=第一个字符串与第二个字符串内容相同!=第一个字符串与第二个字符串内容不同,!号表示相反的意思-z检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串 #两个字符串不相等 [root@server1 test]# [ $tom != "no" ]&&echo "no" no [root@server1 test]# [ -z '' ]&&echo "yes" yes [root@server1 test]# [ -z ' ' ]&&echo "yes" [root@server1 test]# [ -z "" ]&&echo "yes" yes [root@server1 test]# [ "tom" = "tom" ]&&echo "yes" yes [root@server1 test]# [ "tom" = "jerry" ]&&echo "yes" [root@server1 test]# [ "tom" != "jerry" ]&&echo "yes" yes #!/bin/bash read -p "是否输入[yes/no]:" dd [ $dd = "yes" ]&&echo "输入" [root@server1 test]# sh test.txt 是否输入[yes/no]:yes 输入 [root@server1 test]# sh test.txt 是否输入[yes/no]:no [root@server1 test]# vi test.txt 创建用户 #!/bin/bash read -p "是否创建用户(yes/no):" dd [ $dd = yes ]&& useradd jerry echo "用户jerry创建成功" [root@server1 test]# sh a.txt 是否创建用户(yes/no):yes 用户jerry创建成功 创建文件 #!/bin/bash read -p "是否创建/test/jerry目录(yes/no):" dd [ -d /test/jerry ]&& echo "/test/jerry" || mkdir /test/jerry && echo "目录创建完成" [root@server1 test]# sh b.txt 是否创建/test/jerry目录(yes/no):^[[A /test/jerry 目录创建完成

    1.5:逻辑测试

    基本格式 格式一: [ 表达式1 ] 操作符 [ 表达式2 ] ... 格式二: 命令1 操作符 命令2 ... 常用的测试操作符解释&&逻辑与,“而且”的意思,使用test命令测试时,可将“&&”改为“-a”ll逻辑或,“或者”的意思,使用test命令测试时,可将“!逻辑否 [root@server1 test]# [ -d /etc ] && [ -r /etc ] && echo "yes" yes [root@server1 test]# [ -d /etc ] || [ -r /etc ] && echo "yes" yes

    二:if 语句的结构

    2.1:单分支结构

    单分支结构(基本格式) if 条件测试操作 then 命令序列 fi 在这里插入代码片 单分支结构(举例) if 磁盘已用空间>70% then 报警 fi

    单分之针对成立 exit 1异常退出 exit 0正常退出

    #!/bin/bash read -p "请输入目录位置:" DD if [ ! -d $DD ] then mkdir -p $DD echo "$DD创建完成" fi [root@server1 test]# sh c.sh 请输入目录位置:/test/jiesi /test/jiesi创建完成 [root@server1 test]# ll 总用量 16 -rw-r--r--. 1 root root 116 107 22:28 a.txt -rw-r--r--. 1 root root 154 107 22:39 b.txt -rw-r--r--. 1 root root 120 107 23:34 c.sh drwxr-xr-x. 2 root root 6 107 22:38 jerry drwxr-xr-x. 2 root root 6 107 23:35 jiesi -rw-r--r--. 1 root root 81 107 22:19 test.txt drwxr-xr-x. 2 root root 6 107 19:31 tom

    2.2:双分支结构

    双分支结构(基本格式) if 条件测试操作 then 命令序列1 else 命令序列2 fi 双分支结构(举例) if 80端口是否在监听 then 网站服务已在运行 else 启动httpd服务 fi

    #!/bin/bash read -p "请输入IP地址:" dd ping -c 3 -i 0.2 -W 3 $shuai $>/dev/null #-c:发送包 -i:发送间隔 -W:等待时间 if [ $? -eq 0 ] then echo "host $dd is up" else echo "host $dd is down" fi [root@server1 test]# sh e.sh 请输入IP地址:8.8.8.8 ping: $: 未知的名称或服务 host 8.8.8.8 is down #!/bin/bash read -p "请输入目录位置:" dd if [ -d $dd ] then echo "目录已存在" else mkdir -p $dd fi [root@server1 test]# sh f.sh 请输入目录位置:/test/pyb [root@server1 test]# sh f.sh 请输入目录位置:pyb 目录已存在

    2.3:多分支结构

    多分支结构(基本格式) if 条件测试操作1 then 命令序列1 elif 条件测试操作2 then 命令序列2 else 命令序列3 fi 多分支结构(举例) if 分数为80~100之间 then 判为优秀 elif 分数为60~79之间 then 判为合格 else 判为不合格 fi

    2.4:多分支实例

    #输入成绩,0-60(几个);60-80(合格);80-100(优秀) #!/bin/bash read -p "请输入成绩:" score if [ $score -lt 0 ] || [ $score -gt 100 ] then echo "输入有误" exit 1; elif [ $score -ge 80 ] && [ $score -le 100 ] then echo "成绩优秀" elif [ $score -ge 60 ] && [ $score -le 80 ] then echo "成绩合格" else echo "成绩不合格" fi [root@server1 test]# sh grade.sh 请输入成绩:55 成绩不合格 [root@server1 test]# sh grade.sh 请输入成绩:80 成绩优秀 [root@server1 test]# sh grade.sh 请输入成绩:77 成绩合格 [root@server1 test]# sh grade.sh 请输入成绩:18 成绩不合格 [root@server1 test]# sh grade.sh 请输入成绩:102 输入有误 [root@server1 test]# sh grade.sh 请输入成绩:-3 输入有误 #输入睡眠时间,0-6(少);6-8(很好);8-24(太多了);其他(输入有误,一天只要24小时) #!/bin/bash read -p "请问你一天睡了几小时:" sleep if [ $sleep -ge 0 ] && [ $sleep -le 24 ] then if [ $sleep -ge 6 ] && [ $sleep -le 8 ] then echo "睡眠很好" elif [ $sleep -ge 1 ] && [ $sleep -le 5 ] then echo "您睡的太少了,请注意身体" else echo "您睡的太多啦,努力学习" fi else echo "一天只要24小时哦" fi [root@server1 test]# sh shengti.sh 请问你一天睡了几小时:4 您睡的太少了,请注意身体 [root@server1 test]# sh shengti.sh 请问你一天睡了几小时:7 睡眠很好 [root@server1 test]# sh shengti.sh 请问你一天睡了几小时:16 您睡的太多啦,努力学习 [root@server1 test]# sh shengti.sh 请问你一天睡了几小时:26 一天只要24小时哦

    三:case语句

    case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。

    #!/bin/bash read -p "请输入性别:" sex read -p "请输入成绩:" score case $sex in 男) case $score in [1-9]|10) echo "你进入男子组" ;; *) echo "你没有进入男子组" esac ;;) case $score in [1-9]|10) echo "你进入女子组" ;; *) echo "你没有进入女子组" esac ;; *) echo "您输入的性别错误" esac [root@server1 test]# sh running.sh 请输入性别:女 请输入成绩:6 你进入女子组 [root@server1 test]# sh running.sh 请输入性别:男 请输入成绩:11 你没有进入男子组

    如果您觉得有用的话,给个三连吧! 有任何问题,都可私信博主,或者在评论区留言。。。

    Processed: 0.011, SQL: 8