当前位置: 首页 > news >正文

流程控制之条件判断

目录

流程控制之条件判断

2.1.if语句语法

2.1.1单分支结构

2.1.2双分支结构

2.1.3多分支结构

2.2.案例

例一:

例2:

例3:

例4:

例5:

例6:

例7:

例8:

例9:

2.3.case多条件判断

2.3.1.格式

2.3.2.执行过程

例10:


流程控制之条件判断

2.1.if语句语法

2.1.1单分支结构

# 语法1:
        if <条件表达式>
        then
        指令
        fi

#语法2:
        if <条件表达式>;then
        指令
        fi                           #  if,if 标志循环起始终止

2.1.2双分支结构

        if <条件表达式
        then
                指令序列1
        else
                指令序列2
        fi

2.1.3多分支结构

        if 条件表达式

        then
                指令序列1
        elif 条件表达式2

        then
                指令序列2
        else
                指令序列n
        fi

等价于:

        if 条件表达式1;then

                分支1

        else

                if 条件表达式2then

                        分支

                else

                        if 条件表达式nthen

                                分支

                        else

                                 分支

                        fi

                fi

        fi 

等价于:

        if 条件表达式1;then

                if 条件表达式2then

                        if 条件表达式nthen

                         else

                         if

                else

                if

        else

        if

2.2.案例

例一:

编写脚本choice1.sh,利用单分支结构实现输入2个整数,判断最大值后输出

read -p "输入整数x:" x
read -p "输入整数y:" y
max=$x            
if [ $max -le $y ] 
thenmax=$yfi
echo "最大值为$max"

注意:此时只能解决较为简单的数值比较,无法判断输入参数类型。若预实现判断类型,请查看上一篇博客

例2:

面试题: 编写脚本choice2.sh,判断当前系统的剩余内存大小,若低于100M则发送消息进
行告警

查看内存容量:[root@server ~]# free -m      注意:-h显示内容带参数

提取内存剩余容量参数:

        [root@server ~]# free -m |tr -s " " | grep Mem 
        Mem: 1935 1249 66 21 805 686
        [root@server ~]# free -m |tr -s " " | grep Mem |cut -d " " -f4
        66
编写脚本:

sun=$(free -m | tr -s " " | grep Mem | cut -d " " -f4)if [[ $sun < 100 ]]
thenecho "警告:内存容量低于100M"
elseecho "剩余内存为$sun M,空间足够"
fi

例3:

编写脚本choice3.sh,判断当前脚本的执行者身份,若不是root账户执行则输出提示,并提示立刻退出脚本执行

查看当前账户身份:(四种方法)

[root@server ~]# vim choice2.sh 
[root@server ~]# whoami

root
[root@server ~]# id -u        # 只有管理员账户uid为0
0
[root@server ~]#  echo $UID
0

[root@server ~]# echo $USER    
root                                        # 扩展:su - root 重建立当前系统的环境变量

方法一:利用uid来判断

[root@server ~]# vim choice3.sh

account=$(id -u)if [ $account -eq 0 ]
thenecho "当前脚本执行者身份为root"
elseecho "当前脚本执行者不是root,立刻退出脚本执行"fi

[root@server ~]# bash choice3.sh 
        当前脚本执行者身份为root
[root@server ~]# mv choice3.sh /         # 若要所有账号都可执行该文件则,将文件移动到根下
[root@server ~]# ls /

        afs  boot        dev  home  lib64  mnt  proc  run   srv  tmp  var
        bin  choice3.sh  etc  lib   media  opt  root  sbin  sys  usr

[root@server ~]# su fox
[fox@server root]$ bash /choice3.sh 

        当前脚本执行者不是root,立刻退出脚本执行

[fox@server root]$ su root 
        密码: 
[root@server ~]# bash /choice3.sh 
        当前脚本执行者身份为root

方法二:使用$USER命令来判断

account=$( echo $USER )if [[ $account == "root" ]]
thenecho "当前脚本执行者身份为root"
elseecho "当前脚本执行者不是root,立刻退出脚本执行"fi

使用su - root 重建立当前系统的环境变量后执行以下操作

[root@server ~]# bash /choice3.sh 
当前脚本执行者不是root,立刻退出脚本执行

例4:

编写脚本choice4.sh,实现闺年的判断

口诀:闰年:能被4整除但不能被100整除     或者    能被400整除的年份

read -p "请输入四位数年份:" year
if [ $(($year%4)) -eq 0 ] && (( $(($year%400)) != 0 )) || [ $(($year%400)) -eq  0 ]
thenecho "$year年是闰年"
elseecho "$year年是平年"
fi

[root@server ~]# bash choice4.sh 
请输入四位数年份:55
55年是平年
[root@server ~]# bash choice4.sh 
请输入四位数年份:4
4年是闰年
[root@server ~]# bash choice4.sh 
请输入四位数年份:444
444年是闰年

例5:

编写脚本choice5.sh,判断sshd是否运行

[root@server ~]# vim choice5.s
read -p "输入运行的软件名:" name
num=$(ps -ef |grep $name | grep -v grep |wc -l)
if [ $num  -gt 0 ];thenecho "程序$name正在运行!"
fi

[root@server ~]# bash choice5.sh 
输入运行的软件名:sshd
程序sshd正在运行!

解析:

通过进程查看sshd是否运行

        [root@server ~]# ps -ef |grep sshd | grep -v grep

                # 含义:查看并过滤sshd进程,查看并反向过滤grep(不包含grep)

root       33911   32991  0 19:27 pts/2    00:00:00 grep --color=auto sshd
        # 该进程为命令本身所对应的进程

[root@server ~]# ps -ef |grep sshd | grep -v grep |wc -l
7              # 过滤行数

通过端口查看sshd是否运行

[root@server ~]# netstat -lntup | grep 22

[root@server ~]# netstat -lntup | grep 22 |wc -l
2

总结:        

        [root@server ~]# ps -ef |grep  服务名称 | grep -v grep

        [root@server ~]# netstat -lntup | grep 端口号

        查看某程序是否运行

例6:

        编写脚本choice6.sh ,输入百分制成绩,判断后输出等级成绩

方法一:

[root@server ~]# vim choice6.sh

read -p "请输入百分制成绩:" scoreif [ -z $score ];thenecho "未输入数字,请重新输入!"
elif [ $score -gt 100 ];thenecho "请输入百分制成绩!"
elif [ $score -ge 90 -a $score -le 100 ];thenecho "A"
elif [ $score -ge 80 ];thenecho "B"
elif [ $score -ge 70 ];thenecho "C"
elif [ $score -ge 60 ];thenecho "D"
elif [ $score -gt 0 ];thenecho "E"
elif [ $score -eq 0 ];thenecho "宝宝真棒!!!!!"
else [ $score -lt 0 ];thenecho "请输入百分制成绩!!!"
fi

[root@server ~]# bash choice6.sh 
请输入百分制成绩:120
请输入百分制成绩!
[root@server ~]# bash choice6.sh 
请输入百分制成绩:100    
A
[root@server ~]# bash choice6.sh 
请输入百分制成绩:60
D
[root@server ~]# bash choice6.sh 
请输入百分制成绩:34
E
[root@server ~]# bash choice6.sh 
请输入百分制成绩:0
宝宝真棒!!!!!
[root@server ~]# bash choice6.sh 
请输入百分制成绩:-1
请输入百分制成绩!!!!
[root@server ~]# bash choice6.sh 
请输入百分制成绩:
未输入数字,请重新输入!

方法二:

read -p "请输入百分制成绩:" scoreif [ -z $score ];thenecho "为输入数字,请重新输入!"
elif [ $score -lt 0 -o $score -gt 100 ];thenecho "成绩有误,重新输入成绩!"
elif [ $score -ge 90 -a $score -le 100 ];thenecho "A"
elif [ $score -ge 80 ];thenecho "B"
elif [ $score -ge 70 ];thenecho "C"
elif [ $score -ge 60 ];thenecho "D"
elif [ $score -gt 0 ];thenecho "E"
else [ $score -eq 0 ];thenecho "宝宝真棒!!!!!"
fi

请输入百分制成绩:123
成绩有误,重新输入成绩!
[root@server ~]# bash  choice66.sh
请输入百分制成绩:-1  
成绩有误,重新输入成绩!

例7:

编写脚本choice7.sh,判断主机的cpu品牌

计算机CPU信息储存位置:

        [root@server ~]# cat  /proc/cpuinfo                 # vendor_id  cpu品牌对应字段

[root@server ~]# grep "vendor_id" /proc/cpuinfo  |uniq  |cut -d " " -f2
GenuineIntel                                # 截取CUP信息

[root@server ~]# vim choice7.sh

vendor=$(grep "vendor_id" /proc/cpuinfo | uniq |cut -d " " -f2)if [ $vendor == GenuineIntel ];thenecho "Inter"
elif [ $vendor == GenuineAMD ];thenecho "AMD"
elseecho "nukonw"
fi

[root@server ~]# bash choice7.sh
Inter

例8:

编写脚本choice8.sh,检测主机是否存活

        一般通过ping来实现测试的。开启另一台虚拟设备Node1

[root@server a1]# vim choice8.sh

read -p "请输入你需要测试的主机地址:" IP
ping -c 2 -w 3 $IP  &> /dev/nullif [ $? -eq 0 ];thenecho "主机$IP已经运行"
elseecho "主机$IP没有正常运行"fi

[root@server a1]# bash choice8.sh 
请输入你需要测试的主机地址:192.168.17.129
主机192.168.17.129已经运行

[root@server a1]# bash choice8.sh 
请输入你需要测试的主机地址:192.168.17.130
主机192.168.17.130没有正常运行

#  上例修改,使用循环测试多台主机,存活的主机显示应用高亮的颜色显示

for IP in 192.168.17.{128..135}
do
#read -p "请输入你需要测试的主机地址:" IPping -c 2 -w 3 $IP  &> /dev/nullif [ $? -eq 0 ];thenecho -e "\e[1;31m 主机$IP已经运行\e[0m"elseecho "主机$IP没有正常运行"fi
done

测试结果:

例9:

        编写脚本choice9.sh,根据用户的输入内容,判断是数字、字母、其它字符

[root@server a1]# vim choice9.sh 

read -p "请输入字母、数字或其他字符:" strif echo $str | grep [a-zA-Z] &> /dev/null;thenecho "输入字符为字母!"
elif    echo $str | grep  [0-9] &> /dev/null;thenecho "输入字符为数字!!"
elseecho "输入结果为其他字符!!!"
fi

[root@server a1]# bash choice9.sh 
请输入字母、数字或其他字符:123456
输入字符为数字!!
[root@server a1]# bash choice9.sh 
请输入字母、数字或其他字符:asdffg
输入字符为字母!
[root@server a1]# bash choice9.sh 
请输入字母、数字或其他字符:[]\

输入结果为其他字符!!!

2.3.case多条件判断

2.3.1.格式

case  变量名  in
        值1)        # 入口数据
          指令1

        ;;
        值2)        # 入口数据
          指令2

        ;;
        值3)        # 入口数据
          指令3

        ;;

        *)
        默认
esac

注意:# 将变量名拿到值1、值2、值3中做等于比较,case做不了除等于以外的比较。

              等于哪一个值,就执行对应的指令。;;表示结束 。

              若都没有匹配上,则会自动匹配*),并执行对应的默认命令

2.3.2.执行过程

case语句会将该变量的值与 括号中的值相比较,如果与某个值相等,则执行对应语句。

当遇到“;;”符号时,就跳出case语句,执行esac语句后面的语句。
如果没有与任何一个值相匹配,则执行*)后面的一组语句

例10:

        编写脚本choice10.sh,对上例6的百分制成绩判断等级成绩进行改写

[root@server a1]# vim choice10.sh

read -p "请输入百分制成绩:" scorecase $score in9[0-9]|100)echo "等级A";;8[0-9])echo "等级B";;6[0-9]|7[0-9])echo "等级C";;[0-9]|[1-5][0-9])echo "等级D";;*)echo "请输入百分制成绩!!谢谢!"
esac

相关文章:

流程控制之条件判断

目录 流程控制之条件判断 2.1.if语句语法 2.1.1单分支结构 2.1.2双分支结构 2.1.3多分支结构 2.2.案例 例一: 例2: 例3: 例4: 例5: 例6: 例7: 例8: 例9: 2.3.case多条件判断 2.3.1.格式 2.3.2.执行过程 例10: 流程控制之条件判断 2.1.if语句语法 2.1.1单分…...

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程&#xff0c;这样…...

Cmake找不到mysql.h和libmysqlclient.so

查看mysql.h和libmysqlclient.so的路径 eikeik-Virtual-Machine:~/桌面/dbpool/bin$ locate mysql.h /usr/include/mysql/mysql.h eikeik-Virtual-Machine:~/桌面/dbpool/bin$ locate libmysqlclient.so /usr/lib/x86_64-linux-gnu/libmysqlclient.so /usr/lib/x86_64-linux-g…...

图论——二分图

图论——二分图 二分图通俗解释 有一个图&#xff0c;将顶点分成两类&#xff0c;边只存在不同类顶点之间&#xff0c;同类顶点之间设有边。称图 G 为二部图&#xff0c;或称二分图&#xff0c;也称欧图。 性质 二分图不含有奇数环图中没有奇数环&#xff0c;一定可以转换为二…...

国产浪潮服务器:风扇免手动调节脚本

简介&#xff1a;浪潮集团&#xff0c;是中国本土顶尖的大型IT企业之一&#xff0c;中国领先的云计算、大数据服务商。浪潮集团旗下拥有浪潮信息、浪潮软件、浪潮国际&#xff0c;业务涵盖云计算、大数据、工业互联网等新一代信息技术产业领域&#xff0c;为全球120多个国家和地…...

智能科技企业网站搭建的作用是什么

随着科学技术快速提升&#xff0c;各种智能产品随之而来&#xff0c;每个赛道里都涌入了大量企业商家&#xff0c;有些热门产品更是广受关注&#xff0c;对企业来说&#xff0c;形象、品牌、信息等方面需要完美呈现到用户眼前&#xff0c;而网站无疑是很好的工具。 企业通过【…...

【多组学数据驱动的机器学习:生物医学研究的创新与突破】

简介&#xff1a;随着生物医学研究的不断发展&#xff0c;多组学数据在疾病预防、诊断和治疗方面发挥着越来越重要的作用。本文将介绍如何利用机器学习技术对多组学数据进行综合分析&#xff0c;以及这种方法在生物医学研究中的优势和潜力。 正文&#xff1a; 一、多组学数据…...

AI影响谷歌正在推出新的人工智能模型,用于医疗保健。以下是医生如何使用它们的介绍

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

云仓酒庄带您品法国葡萄酒

说起葡萄酒肯定绕不开法国&#xff0c;法国葡萄酒闻名中外&#xff0c;口碑卓越。作为世界上的产酒大国&#xff0c;可以说是每一寸土地都可以种植葡萄。云仓酒庄的品牌雷盛红酒分享这么优秀的一个葡萄酒产酒国有哪些特点呢&#xff1f; 1.产区特色&#xff1a;波国有最著名的…...

XIAO ESP32S3之实现口罩检测

一、例程介绍 此例程是运行FOMO 轻量检测模型实现人员佩戴口罩检测&#xff0c;Demo中已包含训练好的模型参数&#xff0c;无需再训练。 FOMO(Faster Objects, More Objects) 是由 Edgeimpulse 工程师提出的一种轻量级的目标检测模型&#xff0c;其主要特点是模型非常小&#…...

LVS简介及LVS-NAT负载均衡群集的搭建

目录 LVS群集简介 群集的含义和应用场景 性能扩展方式 群集的分类 负载均衡&#xff08;LB&#xff09; 高可用&#xff08;HA&#xff09; 高性能运算&#xff08;HPC&#xff09; LVS的三种工作模式 NAT 地址转换 TUN IP隧道 IP Tunnel DR 直接路由 Direct Rout…...

ElasticSearch之cat segments API

命令样例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/segments?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果输出如下&#xff1a; index shard prirep ip segment g…...

docker镜像与容器的迁移

docker容器迁移有两组命令&#xff0c;分别是 save & load &#xff1a;操作的是images&#xff0c; 所以要先把容器commit成镜像export & import&#xff1a;直接操作容器 我们先主要看看他们的区别&#xff1a; 一 把容器打包为镜像再迁移到其他服务器 如把mysq…...

Cmake基础(2)

使用一个简单的示例来应用cmake&#xff0c;无任何三方库的单一的应用程序项目 你可以收获 使用cmake生成VS项目生成mingw项目(makefile) 1 首先新建一个cpp&#xff0c;我们要做一个控制台应用程序 #include<iostream> void main(){std::cout<<"hello cm…...

OSPF理论总结与实验

第1章 OSPF[1] 本章阐述了OSPF协议的特征、术语&#xff0c;OSPF的路由器类型、网络类型、区域类型、LSA类型&#xff0c;OSPF报文的具体内容及作用&#xff0c;描述了OSPF的邻居关系&#xff0c;通过实例让读者掌握OSPF在各种场景中的配置。 本章包含以下内容&#xff1a; …...

浅谈安科瑞无线测温产品在巴西某工厂的应用

摘 要&#xff1a;高压开关设备是变电站和配电站中保证电力系统安全运行的重要设备之一,因此,开关柜的稳定运行对于整个电力系统有非常重要的意义。设备老化、长期高负荷运行都可能使设备局部温度过高而发生火灾&#xff0c;因此,对变电站内的敏感设备进行温度检测变得尤为重要…...

RabbitMQ 命令

Docker # 进入容器 > docker exec -it rabbitmq /bin/bash# 帮助 > rabbitmq-service help# 查看所有队列 > rabbitmqctl list_queues Windows 进入安装目录【D:\Program Files\RabbitMQ Server\rabbitmq_server-3.9.10\sbin】输入cmd # 帮助 > rabbitmq-servic…...

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品&#xff0c;和开源数据库OpenGauss之间又是什么样的关系&#xff0c;刚开始接触的时候是一头雾水&#xff0c;因此本文简要对比下二者的区别&#xff0c;以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…...

FFmpeg的AVInputFormat

文章目录 结构体定义操作函数支持的AVOutputFormat 通过上面的分析&#xff0c;基本可以看到ffmpeg的套路了&#xff0c;首先一个context上下文&#xff0c;上下文里面一个priv_data 指针&#xff0c;然后再插件结构体中有一个priv_data_size&#xff0c;然后回调函数。 结构体…...

SQL命令---删除字段

介绍 使用sql语句删除表字段。 命令 alter table 表名 drop 字段名;例子 删除a表中的name字段。 alter table a drop name;下面是执行删除后的表结构&#xff1a;...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...