Shell的条件语句

一 条件测试

  1.1文件测试与整数测试  

 1.2字符串测试与逻辑测试

二 If语句

  2.1If单分支语句

  2.2If双分支语句

  2.3If多分支语句

三 Case分支语句

四 总结

一 条件测试操作

1.1文件测试

要使shell脚本程序具备一定的"智能",面临的第一个问题是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等

 Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具--test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条成立)。

语法格式:

格式1 test条件表达式

格式2[ 条件表达式 ]

注意中括号和表达式中间需要隔一个空格

或 [[条件表达式]]

文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。

-d:测试是否为目录(Directory)。

-e:测试目录或文件是否存在(Exist)。

-f:测试是否为文件(File)。

-r:测试当前用户是否有权限读取(Read)。

-W:测试当前用户是否有权限写入(Write)。

-X:测试是否设置有可执行(Excute)权限。

-b:测试是否为设备文件

-C:测试是否为字符设备文件

-S:测试存在且文件大小为空

-L:测试是否为链接文件

执行条件测试操作以后,通过预定义变量$?可以获得测试命令的返回状态值,从而判断该条件是否成立。例如,执行以下操作可测试目录/media/是否存在,如果返回值$?为0,表示存在此目录,否则表示不存在或者虽然存在但不是目录

例1

test -d /etc/sysconfig/

test -f /etc/sysconfig/

test -e /etc/sysconfig/

例2

[ -f /home/humajun/ ]

[ -d /home/humajun/ ] && echo "YES"

[ ! -e /opt/kgc ] && mkdir /opt/kgc

1.2整数值比较

 整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整数之间。常用测试操作符

-eq:第一个数等于(Equal)第二个数。

-ne:第一个数不等于(Not Equal)第二个数

-gt:第一个数大于(GreaterThan)第二个数

-1t:第一个数小于(LesserThan)第二数

-le:第一个数小于或等于(Lesser or Equal)第二个数

-ge:第一个数大于或等于(Greater or Equal)第二个数

例1

who |wc -1

[ $(who|wc -1)-le 5 ]&& echo"用户太少

[ $(who|wc -1)-ge 10 ]&& echo ">= 10. "

例2

FreeCC=$(free -m | grep "Mem: " | awk '{print $6}')

[ $FreeCC -lt 4096 ] && echo ${FreeCC}MB

mem_size= $(free -m | grep "Mem: " | awk '{print $4}')

[ $mem_size -ge 1024] && echo

"由于192.168.10.17服务器系统内存资源不足,请尽快处理故障。

 1.3字符串比较

字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,也可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下。

=:第一个字符串与第二个字符串相同。

!=:第一个字符串与第二个字符串不相同,其中 !〃符号表示取反。

-z:检查字符串是否为空(zero),对于未定义或赋予空值的变将视为空串。

例1

echo $LANG

Zh_CN.UTF-8

[ $LANG != "en.Us" ] && echo "Not en.Us"

例2

read -p "是否覆盖现有文件 (yes/no) ?" ACK

是否覆盖现有文件(yes/no)?yes[ SACK= "yes"] && echo"覆盖"

1.4逻辑测试

逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程。

常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间。

&&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0(结果成立)。使用test命令测试时,"&&"可改为"-a”。

||:逻辑或,表示"或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为0(结果成立)。使用test命令测试时,“&&”可改为-o。

!:逻辑否,表示"不”,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)。

例1

[-d /etc] && [-r /etc] && echo "You can open it"

[-d /etc] || [-d/home] && echo"ok"

 在上述逻辑测试的操作选项中,“&&”和"||“通常也用于间隔不同的命令操作,其作用是相似的。实际上此前已经接触过"&&"操作的应用,如make && make install"的编译安装操作。

例如,若要判断当前Liux系统的内核版本是否大于3.4,可以执行以下操作。其中,内核版木号通过uname和awk命令获得

二、if语句

2.1 if单分支语句

单分支结构(基本格式)

if 条件测试操作

then  命令序列

fi

单分支结构(举例)

if 磁盘已用空间>80%

then  报警

fi

[root@localhost opt]# vim eee.sh

#!/bin/bash

dir "/opt/demo02"

if [ ! -d $dir ] '若不存在/opt/demo2,则执行下述命令'

 then

        mkdir -p $dir

        echo "$dir创建成功"

fi

[root@localhost opt]# chmod +x eee.sh

[root@localhost opt]# ./eee.sh

/opt/demo02创建成功

2.2 if双分支语句

双分支结构(基本格式)

if 条件测试操作

then  命令序列1

else  命令序列2

fi

双分支结构(举例)

if 80端口是否在监听

then  网站服务已在运行

else  启动httpd服务

fi

举例1:

[root@localhost opt]# vim eee.sh

#!/bin/bash

dir="/opt/demo02"

if [ ! -d $dir ]

 then

        mkdir -p $dir

        echo "$dir创建成功"

  else

        echo "$dir已存在"

fi

[root@localhost opt]# ./eee.sh

/opt/demo02已存在

举例2:查看目标主机是否存活,显示检测结果

[root@localhost opt]# vim fff.sh

#!/bin/bash

read -p "请输入IP地址:" addr

ping -c 3 -i 0.2 -W 3 $addr &> /dev/null

if [ $? -eq 0 ]

        then

                echo "$addr is up"

        else

                echo "$addr is down"

fi

[root@localhost opt]# chmod +x fff.sh

[root@localhost opt]# ./fff.sh

请输入IP地址:192.168.100.1      

192.168.100.1 is down

[root@localhost opt]# ./fff.sh

请输入IP地址:192.168.197.1

192.168.197.1 is up

其中:

-c:发送三个包

-i: 发包间隔0.2秒

-W:等待时间3秒

2.3 if多分支语句

多分支结构(基本格式)

if 条件测试操作1

then  命令序列1

elif  条件测试操作2

then  命令序列2

else

命令序列3

fi

多分支结构(举例)

if 分数为85~100之间

then  判为优秀

elif  分数为70~84之间

then  判为合格

else

判为不合格

fi

举例:判断分数范围,分数优秀,合格,不合格三挡

[root@localhost opt]# vim ggg.sh

#!/bin/bash

read -p "请输入成绩:" score

if [ $score -lt 0 ] || [ $score -gt 100 ]

  then

        echo "输入有误"

        exit 1;

elif [ $score -ge 85 ] && [ $score -le 100 ]

  then

        echo "成绩优秀"

elif [ $score -ge 70 ] && [ $score -le 84 ]

  then

        echo "成绩合格"

else

        echo "成绩不合格"

fi

[root@localhost opt]# ./ggg.sh

请输入成绩:100

成绩优秀

[root@localhost opt]# ./ggg.sh

请输入成绩:82

成绩合格

[root@localhost opt]# ./ggg.sh

请输入成绩:53  

成绩不合格

[root@localhost opt]# ./ggg.sh

请输入成绩:111

输入有误

[root@localhost opt]# ./ggg.sh

请输入成绩:-23

输入有误

三、case多分支语句

3.1 case语句的结构

针对变量的不同取值,分别执行不同的命令序列

这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值

case语句是匹配模式,一个模式对应一组命令,相当于大仓库一样,想调用哪个命令就调用哪一条命令

双分号;;表示命令序列的结束

格式:

case 变量值 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

....

*)

默认命令序列

esac

case 控制指令 in

start)

启动XX服务

;;

stop)

停止XX服务

;;

....

*)

显示服务脚本的用法

esac

3.2 case语句的实例

3.2.1 创建一个判断输入类型的脚本

提示用户输入一个字符

判断出该字符是字母,数字或者其他字符

[root@localhost opt]# vim panduan.sh

#!/bin/bash

read -p "请输入一个字符:" aa

case "$aa" in

[0-9])

        echo "你输入的是数字"

        ;;

[a-z]|[A-Z])

        echo "你输入的是字母"

        ;;

*)

        echo "你输入的是符号"

esac

~  

[root@localhost opt]# chmod +x panduan.sh

[root@localhost opt]# ./panduan.sh

请输入一个字符:3

你输入的是数字

[root@localhost opt]# ./panduan.sh

请输入一个字符:e

你输入的是字母

[root@localhost opt]# ./panduan.sh

请输入一个字符:#

你输入的是符号

3.2.2 判断学生成绩的优良

成绩0-100分
0-59分:不及格
60-74:及格
75-84:良好
85-100:优秀

[root@localhost opt]# vim chengji.sh

#!/bin/bash

read -p "请输入你的成绩:" aa

case "$aa" in

#[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])

[1-5][0-9]|[0-9])

        echo "你的成绩不合格"

        ;;

6[0-9]|7[0-4])    //方括号里表示一个连续的范围,这个范围只能是0-9

        echo "你的成绩合格"

        ;;

7[5-9]|8[0-4])

        echo "你的成绩良好"

        ;;

8[5-9]|9[0-9]|100)

        echo "你的成绩优秀"

        ;;

*)

        echo "输入有误"

esac

~       

[root@localhost opt]# ./chengji.sh

请输入你的成绩:0           

你的成绩不合格

[root@localhost opt]# ./chengji.sh

请输入你的成绩:59

你的成绩不合格

[root@localhost opt]# ./chengji.sh

请输入你的成绩:60

你的成绩合格

[root@localhost opt]# ./chengji.sh

请输入你的成绩:74

你的成绩合格

[root@localhost opt]# ./chengji.sh

请输入你的成绩:75

你的成绩良好

[root@localhost opt]# ./chengji.sh

请输入你的成绩:84

你的成绩良好

[root@localhost opt]# ./chengji.sh

请输入你的成绩:85

你的成绩优秀

[root@localhost opt]# ./chengji.sh

请输入你的成绩:100

你的成绩优秀

[root@localhost opt]# ./chengji.sh

请输入你的成绩:101

输入有误

[root@localhost opt]# ./chengji.sh

请输入你的成绩:-1

输入有误

四 总结

1.条件测试的语法:文件测试、整数值比较、字符串比较、逻辑测试

2.条件语句的语法:单分支、双分支、多分支

3.case多分支语句的语法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 💖The Begin💖点点关注,收藏不迷路💖 输入一个字典,要求将该字典的键和值对换。(注意,字典中有键的值是重复的) 输入: 一行&#xff0…

信息系统项目管理师0137:输出(8项目整合管理—8.9结束项目或阶段—8.9.3输出)

点击查看专栏目录 文章目录 8.9.3 输出8.9.3 输出 项目文件(更新)可在结束项目或阶段更新所有项目文件,并标记为最终版本。特别值得注意的是,经验教训登记册的最终版本要包含阶段或项目收尾的最终信息。最终版本的经验教训登记册可包含:效益管理、项目评估的准确性、项目和…

PostgreSQL教程

引言 PostgreSQL,简称Postgres,是一个强大、开源的对象关系型数据库管理系统(ORDBMS)。它因其高性能、稳定性和灵活性而广受欢迎。本文将详细介绍PostgreSQL,从安装、基本操作到高级功能,帮助你全面掌握这…

修改vuetify3的开关组件v-switch在inset模式下的大小

<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1&#xff1a;本页面使用 本页面中使用&#xff0c;必须要含有lang“scss” scoped&#xff0c;才会生效 <style lang"scss"…

基础漏洞系列——CSRF跨站请求伪造

简介&#xff1a; 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack或者 session riding&#xff0c;通常缩写为 CSRF或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操…

【会议征稿,JPCS出版】2024年航空航天与力学国际学术会议(ICAM 2024)

2024年航空航天与力学国际学术会议&#xff08;ICAM 2024&#xff09;将于2024年7月12-14日在中国沈阳举办。会议由东北大学机械工程与自动化学院主办&#xff0c;吉林大学机械与航空航天工程学院承办&#xff0c;大连理工大学、沈阳航空航天大学、沈阳建筑大学、沈阳工业大学、…

react面试题----1(基础和生命周期)

react生命周期面试题 1.react 生命周期函数 初始化阶段: getDefaultProps:获取实例的默认属性getInitialState:获取每个实例的初始化状态componentWillMount:组件即将被装载、渲染到页面上render:组件在这里生成虚拟的 DOM 节点componentDidMount:组件真正在被装载之后运行…

适合源代码的加密系统

在信息化高度发展的今天&#xff0c;源代码的安全问题日益受到重视。源代码是企业或组织的核心资产&#xff0c;一旦泄露或被篡改&#xff0c;将会对其造成巨大的经济损失和声誉风险。因此&#xff0c;如何有效防止源代码的泄露和算改成为了企业和组织急需解决的问题。沙盒技术…

unity 安卓层面的简单热更办法

咱们前段时间不是在写个app吗&#xff0c;就暂时不想搞ios端&#xff0c;但是要实现热更的话&#xff0c;咋办呢&#xff1f;按道理说如果只是安卓端热更的话&#xff0c;其实很简单&#xff0c;因为安卓是支持你程序编译的&#xff0c;所以你可以下载程序&#xff0c;进行安装…

代码随想录算法训练营第四十三天 | 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 代码随想录 视频讲解&#xff1a;动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili 解题思路 1. dp[i]对i进行拆分&#xff0c;得到的最大的乘积为dp[i] 2.递推公式 一个是j * (i - j) 直接相…

Sylvester矩阵、子结式、辗转相除法的三者关系(第三部分)

2.执行辗转相除法第二步 F 7 Q 7 , 6 F 6 F 4 deg ⁡ ( F 7 ) 7 deg ⁡ ( F 6 ) 6 deg ⁡ ( F 4 ) 4 F_{7} Q_{7,6} \times F_{6} F_{4}\ \ \ \ \ \ \ \ \ \ \deg\left( F_{7} \right) 7\ \ \ \ \ \ \deg\left( F_{6} \right) 6\ \ \ \ \ \ \deg\left( F_{4} \right)…

【Rust】——使用消息在线程之间传递数据

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

非计算机科班如何顺利转入计算机领域:经验分享与建议

近年来&#xff0c;计算机领域的发展日新月异&#xff0c;吸引了越来越多非计算机科班的人士希望跳槽转入这个行业。对于这些人来说&#xff0c;如何顺利转码成为一名程序员&#xff0c;成为了一个备受关注的话题。在本文中&#xff0c;我将分享一些关于非计算机科班如何顺利转…

架构(十七)翻译监控

一、引言 作者最近做的一个功能是需要监控一个翻译转换&#xff0c;根据国家和语言进行分组&#xff0c;然后定时把监控情况放到ck里面。为什么是分组和定时监控呢&#xff1f;因为调用比较高的系统的qps在单机一万多&#xff0c;70台机器&#xff0c;可怕的高频调用注定他不能…

探秘GPT-4o:从版本对比到技术能力的全面评价

随着人工智能技术的不断发展&#xff0c;自然语言处理领域的突破性技术——GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型也在不断演进。最新一代的GPT-4o横空出世&#xff0c;引起了广泛的关注和讨论。在本文中&#xff0c;我们将对GPT-4o进行全面评…

【喜报】科大睿智多家服务企业上榜2024年第四批DCMM名单

近日&#xff0c;DCMM官方平台发布通知公告&#xff0c;根据《数据管理能力成熟度评估工作管理办法(暂行)》的有关规定&#xff0c;经单位自愿申请&#xff0c;评估机构评估、专家评审及公示&#xff0c;下列27单位获得数据管理能力成熟度等级证书。小编祝贺多家服务企业上榜20…

前端破圈用Docker开发项目

为什么要用 Docker 开发 &#x1f914; 直接在系统上开发不香吗&#xff1f;香&#xff0c;但是 Docker 有下面4香 环境依赖管理&#xff1a;Docker 容器可以管理所有依赖项&#xff0c;例如前端里面的 node 和 npm 版本&#xff0c;不需要在本地安装和维护这些依赖项 隔离&a…

SQL生成自然数,日历序列 浅析

01.sqlserver版本 使用sqlserver将数据复制n条 selectt.indx,t.name,tmp.vlue from (values(1,苹果) ) as t(indx, name) ,(select[number] as vluefrom master.dbo.spt_valueswhere [type] pand [number] between 1 and 10 ) as tmpspt_values是什么 spt_values是SQL Se…

618入手不亏的好物有哪些?五款品质兼优的好物分享!

随着618购物狂欢节的到来&#xff0c;各位消费者们是否已经摩拳擦掌&#xff0c;准备开启一场购物盛宴&#xff1f;在这里&#xff0c;我们为您精心准备了一份不容错过的购物清单&#xff0c;无论您是科技迷、学生还是家居生活爱好者&#xff0c;都能找到心仪的好物。 1、学生…

经典文献阅读之--RepViT-SAM(利用语义分割提高NDT地图压缩和描述能力的框架)

0. 简介 Segment Anything Model (SAM) 最近在各种计算机视觉任务上展现了令人瞩目的零样本迁移性能 。然而&#xff0c;其高昂的计算成本对于实际应用仍然具有挑战性。MobileSAM 提出通过使用蒸馏替换 SAM 中的重图像编码器&#xff0c;使用 TinyViT&#xff0c;从而显著降低了…