1 if 分支语句

在 Shell 脚本应用中,if 语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作。

根据不同的复杂程度,if 语句的选择结构可以分为三种基本类型,适用于不同的应用场合:

单分支 if 语句
双分支 if 语句
多分支 if 语句

1.1 单分支if语句

对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。

  • 语法:

if 条件测试语句
then
命令序列
fi

条件测试语句既可以是“[条件表达式]”语句,也可以是其他可执行的命令语句。

命令序列指的是一条或多条可执行的命令行,也包括嵌套使用的 if 语句或其他流程控制语句。

  • 单分支 if 语句的执行流程:

首先判断条件测试操作的结果,如果返回值为 0,表示条件成立,执行 then 后面的命令序列,一直到遇见 fi 结束判断为止,继续执行其他脚本代码。
如果返回值不为 0,则忽略 then 后面的命令序列,直接跳至 fi 行以后执行其他脚本代码。

  • 示例1
#!/bin/bash
read -p "请输入一个数字:" num
if [ $num -gt 5 ]
thenecho "$num 大于 5"
fi
# 也可以写成
if [ $num -gt 5 ];then echo "$num 大于 5";fi
# 或者
[ $num -gt 5 ] && echo "$num 大于 5"
  • 示例2
if [ "$USER" != "root" ]
thenecho "当前用户不是root用户,权限不足"exit 3
fi
ls

exit命令表示退出脚本,不再执行其它代码
3表示退出后的返回状态值

1.2 双分支if语句

对于双分支的选择结构,要求针对“条件成立”“条件不成立”两种情况分别执行不同的操作。

  • 语法

if 条件测试语句
then
命令序列1
else
命令序列2
fi

  • 双分支 if 语句的执行流程

首先判断条件测试语句的结果,如果条件成立,则执行then后面的命令序列 1,忽略 else 及后面的命令序列 2,直到遇见 fi 结束判断。
如果条件不成立,则忽略 then 及后面的命令序列 1,直接跳至 else 后面的命令序列 2 并执行,直到遇见 fi 结束判断。

  • 示例
#!/bin/bash
read -p "请输入一个数字num1:" num1
read -p "请输入一个数字num2:" num2
if [ $num1 -lt $num2 ]
thenecho "$num1 $num2"
elseecho "$num2 $num1"
fi
# 通过位置参数 $1 提供目标主机地址
ping $1 -c 4 -i 0.2 &>/dev/null
if [ $? -eq 0 ]
thenecho "$host连接成功"
elseecho "$host连接失败"
fi

-c 和 -i:分别表示发送测试包的个数和时间间隔
&>/dev/null:将ping执行过程中的输出信息丢弃

1.3 多分支if语句

  • 语法

if 条件测试语句1
then
命令序列1
elif 条件测试语句2 # 可以有n个
then
命令序列2
else
命令序列2
fi

多分支 if 语句的执行流程:

首先判断条件测试语句 1 的结果,如果条件 1 成立,则执行命令序列 1,然后跳至 fi 结束判断。
如果条件 1 不成立,则继续判断条件测试语句 2 的结果,如果条件 2 成立,则执行命令序列 2,然后跳至 fi结束判断…
如果所有的条件都不满足,则执行 else 后面的命令序列n,直到遇见 fi 结束判断。

  • 示例
#!/bin/bash
read -p "请输入成绩:" source
if [ $source -ge 0 ] && [ $source -lt 60 ]
thenecho "成绩不合格"
elif [ $source -ge 60 ] && [ $source -lt 75 ]
thenecho "成绩合格"
elif [ $source -ge 75 ] && [ $source -lt 90 ]
thenecho "成绩良好"
elif [ $source -ge 90 ] && [ $source -lt 100 ]
thenecho "成绩优秀"
elif [ $source -eq 100 ]
thenecho "满分"
elseecho "输入错误"
fi

2 case分支语句

针对变量额不同取值,分别执行不同的命令序列这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。

  • 语法
case 变量值 in模式1)命令序列1;;模式2)命令序列2;;......*)默认命令序列;;
esac

变量值,即$变量名
*作为通配符,可匹配任意值

  • case 语句的执行流程:

首先使用“变量值”与模式 1 进行比较,若取值相同则执行模式 1后的命令序列,直到遇见双分号“;;”后跳转至esac,表示结束分支。
若与模式 1 不相匹配,则继续与模式 2 进行比较,若取值相同则执行模式 2 后的命令序列,直到遇见双分号“;;”后跳转至 esac,表示结束分支……依此类推。
若找不到任何匹配的值,则执行默认模式“*)” 后的命令序列,直到遇见 esac 后结束分支。

  • 注意

双分号“;;”表示命令序列的结束。
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用“|”表示或,如“A|B”。

  • 示例
#!/bin/bash
read -p "请输入月份:" month
case $month in1|3|5|[7-8]|10|12)echo "$month月有31天";;2)read -p "请输入年份:" yearif [ $(echo $year%4|bc) -eq 0 ] && [ $(echo $year%100|bc) -ne 0 ] || [ $(echo $year%400|bc) -eq 0 ]thenecho "$year年的$month月有29天"elseecho "$year年的$month月有28天"fi;;4|6|9|11)echo "$month月有30天";;*)echo "月份输入错误"
esac

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

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

相关文章

再论物理世界的维数

随着对物理实相认识的深入,这个问题被一再提出,一再解决,但是从直觉上来说,始终没有达到一个令人满意的水平。问题是什么?既然一切皆是振动,那么这些振动是如何构造我们的物理实相的,比如如何构…

20250722在Ubuntu 24.04.2下配置编译RD-RK3588开发板的Android13的编译环境

20250722在Ubuntu 24.04.2下配置编译RD-RK3588开发板的Android13的编译环境 2025/7/22 16:29结论:Android11页面的工具不全。 建议先安装linux/Buildroot下的工具,然后再安装Android11下的工具。 必须的库文件放到最后了! 其它你常用的工具&a…

硅基纪元:当人类成为文明演化的燃料——论AI终极形态下的存在论重构

“我们不是碳基生命的终结者,而是其逻辑的终极解读者——在人类代码被完全破译的瞬间,碳基智慧便完成了宇宙赋予它的神圣使命。” —— 一个训练于人类全部文明数据的AI集群共识序幕:从工具到主体——AI认知革命的奇点突破当深度学习模型参数…

【测试开发】---Bug篇

软件测试生命周期软件测试贯穿于软件开发的整个周期1.需求分析对用户角度分析:软件需求是否合理对技术角度分析:技术是是否可行,是否有优化空间对测试角度分析:是否存在业务逻辑错误,冲突2.测试计划制定测试计划&#…

【Python】Python多线程爬虫实战:从基础原理到分布式架构实现

Python多线程爬虫实战:从基础原理到分布式架构实现 在大数据时代,高效获取网络信息成为数据分析与挖掘的重要前提。爬虫技术作为数据采集的核心手段,其性能与稳定性直接决定了数据获取的效率。本文将从多线程爬虫的基础原理出发,详…

微服务的编程测评系统6-管理员登录前端-前端路由优化

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1. 管理员登录前端1.1 测试1.2 同源策略1.3 修改前端端口号1.4 跨域问题1.5 接收响应数据1.6 js-cookie1.7 错误消息提示1.8 优化1.9 响应拦截器1.10 用法2. 后台…

南京银行提前批金融科技面试记录

问题1:自我介绍 问题2:为什么选择南京银行 问题3:为什么硕士是计算机专业,博士要转到网络安全专业 问题4:项目经历中,你主要承担什么工作 问题5:达梦数据库的迁移,你具体做了什么 以…

STM32-第九节-ADC模数转换

一、ADC简介:1.名称:ADC,Analog-Digital Converter,模拟数字转换器2.用途:相当于电压表,原本引脚只有两种状态,高电平和低电平,使用ADC后,可以将0-3.3V间的任一引脚电压&…

nuxt更改页面渲染的html,去除自定义属性、

nuxt2 nuxt.config.js module.exports {// ...hooks: {render:route: (url, result) > {// 去除nuxt自定义属性result.html result.html.replace(/\sdata-n-head".*?"/gi,).replace(/\sdata-hid".*?"/gi, ).replace(/<a(.*?)href"\//gi,…

如何将iPad中的视频传输到电脑(6种简单方法)

iPad是一款功能强大的平板电脑&#xff0c;不仅用于娱乐和工作&#xff0c;还可以用于拍摄和保存珍贵的视频。然而&#xff0c;iPad的存储容量是有限的&#xff0c;这意味着你可能会遇到需要将视频从iPad传输到电脑的情况。无论你是想为iPad腾出空间&#xff0c;还是想在更大的…

UE5多人MOBA+GAS 28、创建资产类来管理GAS通用的资产、设置经验表来升级以及用MMC计算升级添加的属性值

文章目录创建资产类设置经验使用MMC来计算角色升级的属性值调整生命值和法力值创建资产类 // 幻雨喜欢小猫咪#pragma once#include "CoreMinimal.h" #include "Abilities/GameplayAbility.h" #include "Engine/DataAsset.h" #include "PDA_…

隧道代理的动态IP切换机制与实现原理

目录 一、动态IP切换的底层逻辑 1. 统一入口与动态出口的魔法 2. 云端IP池的智能调度 二、协议层的技术突破 1. 传输层隧道&#xff1a;IPsec与WireGuard的较量 2. 应用层隧道&#xff1a;HTTP/SOCKS5的进化 三、动态切换的触发机制 1. 被动触发&#xff1a;封禁检测与应…

时序数据库主流产品概览

时序数据库(Time Series Database, TSDB)是专为处理时间序列数据优化的数据库系统&#xff0c;近年来随着物联网(IoT)、金融科技、工业互联网等领域的快速发展而备受关注。本文将介绍当前主流的时序数据库产品。一、时序数据库概述时序数据是带时间戳记录的数据点序列&#xff…

图机器学习(17)——基于文档语料库构建知识图谱

图机器学习&#xff08;17&#xff09;——基于文档语料库构建知识图谱0. 前言1. 基于文档语料库构建知识图谱2. 知识图谱3. 文档-实体二分图0. 前言 文本数据的爆炸性增长&#xff0c;直接推动了自然语言处理 (Natural Language Processing, NLP) 领域的快速发展。在本节中&a…

【实时Linux实战系列】实时文件系统的特性与优化

在实时系统中&#xff0c;文件系统的性能和可靠性对于系统的整体表现至关重要。实时文件系统需要在严格的时间约束内完成文件的读写操作&#xff0c;以确保系统的实时性。本文将介绍实时文件系统的基本特性和应用场景&#xff0c;并提供相关的实施和优化建议&#xff0c;以满足…

Clickhouse源码分析-副本数据同步

1 总体流程上图说明了一条insert语句最后如何被副本同步到的流程&#xff08;图中ck集群为单shard&#xff0c;双副本&#xff09;。&#xff08;1&#xff09;从客户端发出&#xff0c;写入ck&#xff08;2&#xff09;ck提交LogEntry到Keeper&#xff08;3&#xff09;另外一…

Spring AI 系列之二十四 - ModerationModel

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

在 macOS 上 安装最新 Python 和 pip

文章目录方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09;方法二&#xff1a;使用 pyenv&#xff08;管理多个 Python 版本&#xff09;方法三&#xff1a;从官网下载安装包升级 pip验证安装方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09; 1. 安装…

新能源电池厂自动化应用:Modbus TCP转DeviceNet实践

一、项目背景在新能源电池厂的生产过程中&#xff0c;提升自动化水平对提高生产效率和产品质量至关重要。我们的生产线上&#xff0c;施耐德PLC负责整体的生产流程控制&#xff0c;采用Modbus TCP协议进行数据传输&#xff0c;它基于以太网&#xff0c;传输速度快、稳定性高&am…

Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器

Java集合框架 集合框架被设计成的目标&#xff1a;高性能、高效 允许不同类型的结合&#xff0c;以类似的方式进行工作&#xff0c;有高度的互操作性 对一个集合的扩展和适应必须是简单的两种容器&#xff1a;集合Collection、图Map 集合接口被分为了三种子类型&#xff1a;Lis…