【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令

目录

  • 一、概述
  • 二、test 命令
    • 2.1 test 命令
    • 2.2 方括号测试条件
    • 2.3 test 命令和测试条件可以判断的 3 类条件
      • 2.3.1 数值比较
      • 2.3.2 字符串比较
  • 三、复合条件测试
  • 四、if-then 的高级特性
  • 五、case 命令


在这里插入图片描述

一、概述

上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令,判断该命令的结果,但在编程中,我们多数情况需要判断一个变量的值是否为空?判断两个变量的值谁更大?判断变量的字符串是否相等?这些判断条件,使用 if 语句无法直接判断。这篇文章介绍

在这里插入图片描述

二、test 命令

2.1 test 命令

if 语句中只能执行该语句后面的命令,并判断命令的退出状态码,而不能判断其他的条件,如:两个值是否相等。如果想要判断两个值是否相等,就需要把这个判断放到一个命令中,再把这个命令放在 if 语句后面去执行,而 test 命令就可以来做这样的判断。

如果 test 命令中列出的条件成立,那么 test 命令就会退出并返回退出状态码 0。
test 命令的格式非常简单:

test condition

condition 是 test 命令要测试的一系列参数和值。当用在 if-then 语句中时, test 命令看起来如下所示:

if test condition
thencommands
fi

如果不写 test 命令的 condition 部分,则它会以非 0 的退出状态码退出并执行 else 代码块语句。

2.2 方括号测试条件

bash shell 提供了另一种条件测试方式,无须在 if-then 语句中写明 test 命令:

if [ condition ]
thencommands
fi

方括号定义了测试条件。
注意,第一个方括号之后和第二个方括号之前 必须 留有空格,否则就会报错。

2.3 test 命令和测试条件可以判断的 3 类条件

test 命令和测试条件可以判断 3 类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

2.3.1 数值比较

使用 test 命令最常见的情形是对两个数值进行比较。下表列出了测试两个值时可用的条件参数

比 较描 述
n1 -eq n2检查 n1 是否等于 n2
n1 -ge n2检查 n1 是否大于或等于 n2
n1 -gt n2检查 n1 是否大于 n2
n1 -le n2检查 n1 是否小于或等于 n2
n1 -lt n2检查 n1 是否小于 n2
n1 -ne n2检查 n1 是否不等于 n2

注意:对于条件测试, bash shell 只能处理整数。

2.3.2 字符串比较

条件测试还允许比较字符串值。下表列出了可用的字符串比较功能

比 较描 述
str1 = str2检查 str1 是否和 str2 相同
str1 != str2检查 str1 是否和 str2 不同
str1 < str2检查 str1 是否小于 str2
str1 > str2检查 str1 是否大于 str2
-n str1检查 str1 的长度是否不为 0
-z str1检查 str1 的长度是否为 0

注意

  • 在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内
  • 大于号和小于号必须转义(\>\< ),否则 shell 会将其视为重定向符,将字符串值当作文件名。
  • 比较测试中使用的是标准的 Unicode 顺序,根据每个字符的 Unicode 编码值来决定排序结果,结果和 sort 命令不同

在这里插入图片描述

三、复合条件测试

if-then 语句允许使用布尔逻辑将测试条件组合起来。可以使用以下两种布尔运算符

  • [ condition1 ] && [ condition2 ]
  • [ condition1 ] || [ condition2 ]

第一种布尔运算使用布尔运算符 AND 来组合两个条件。要执行 then 部分的命令,两个条件都必须满足。
第二种布尔运算使用 OR 布尔运算符来组合两个条件。如果任意条件为真,那么 then 部分的命令就会执行。

例子:

#!/bin/bash
# Testing an AND Boolean compound condition
#
if [ -d $HOME ] && [ -w $HOME/newfile ]
then
echo "The file exists and you can write to it."
#
else
echo "You cannot write to the file."
#
fi

在这里插入图片描述

四、if-then 的高级特性

bash shell 还提供了 3 个可在 if-then 语句中使用的高级特性。\

  • 在子 shell 中执行命令的单括号。
  • 用于数学表达式的双括号。
  • 用于高级字符串处理功能的双方括号。

在这里插入图片描述

五、case 命令

如果在在一组可能的值中寻找特定值,使用if语句来判断的话,代码会很冗长。shell提供了case命令来解决此类问题。
case 命令会采用列表格式来检查变量的多个值,其格式如下:

case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

例子:

#!/bin/bash
# Using a short case statement
#
case $USER in
rich | christine)
echo "Welcome $USER"
echo "Please enjoy your visit.";;
barbara | tim)
echo "Hi there, $USER"
echo "We're glad you could join us.";;
testing)
echo "Please log out when done with test.";;
*)
echo "Sorry, you are not allowed here."
esac

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

软考 系统分析师和系统架构师 项目管理师

软考整起 https://www.ruankao.org.cn/ 什么是计算机技术与软件&#xff08;初级、中级、高级&#xff09;考试&#xff08;软考&#xff09;&#xff1f; - 知乎 系统分析师和系统架构师关系 这两年&#xff0c;我先后报考了计算机技术与软件专业技术资格&#xff08;水平&a…

Spark性能调优之数据序列化

前言 在使用Spark进行数据开发的时候,避不开的一个问题就是性能调优。网上一搜一大堆所谓的调优策略很多作者自己都不知所云,导致读者看了后只会更加困惑。我们在研究一个技术的时候第一手资料永远都请参考官网,官网对性能优化不一定是最全甚至最优,但是可以解决大部分问题…

为Android构建现代应用——应用导航设计

在前一章节的实现中&#xff0c;Skeleton: Main structure&#xff0c;我们留下了几个 Jetpack 架构组件&#xff0c;这些组件将在本章中使用&#xff0c;例如 Composables、ViewModels、Navigation 和 Hilt。此外&#xff0c;我们还通过 Scaffold 集成了 TopAppBar 和 BottomA…

js将当前时间转换成标准的年月日

直接上代码了&#xff1a; /*** * param e 转换成标准的年月日进行拆分* returns */changeCreationtime(e:any) {let year e.getFullYear(),month (e.getMonth() 1) > 9 ? (e.getMonth() 1) : 0 (e.getMonth() 1),day e.getDate() > 9 ? e.getDate() : 0 e.get…

小研究 - JVM 垃圾回收方式性能研究(一)

本文从几种JVM垃圾回收方式及原理出发&#xff0c;研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响&#xff0c;并通过最终测试数据对比&#xff0c;给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…

JVM-运行时数据区

目录 什么是运行时数据区&#xff1f; 方法区 堆 程序计数器 虚拟机栈 局部变量表 操作数栈 动态连接 运行时常量池 方法返回地址 附加信息 本地方法栈 总结&#xff1a; 什么是运行时数据区&#xff1f; Java虚拟机在执行Java程序时&#xff0c;将它管…

PyTorch从零开始实现Transformer

文章目录 自注意力Transformer块编码器解码器块解码器整个Transformer参考来源全部代码&#xff08;可直接运行&#xff09; 自注意力 计算公式 代码实现 class SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, self).__init__()self.e…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

7、Kubernetes核心技术 - Secret

目录 一、Secret概述 二、Secret 三种类型 2.1、Opaque 2..2、kubernetes.io/dockerconfigjson 2.3、kubernetes.io/service-account-token 三、Secret创建 3.1、命令行方式创建 Secret 3.2、yaml方式创建 Secret 四、Secret解码 五、Secret使用 5.1、将 Secret 挂载…

银河麒麟V10 SP1安装网络调试助手

文章目录 系统环境文件准备软件配置过程系统环境 系统镜像:Kylin-Desktop-V10-SP1-General-Release-2203-ARM64.iso 内核:5.4.18-53-generic 文件准备 网络调试助手可执行文件压缩包下载m-net-assist-arm64-main.zip 链接:https://pan.baidu.com/s/10Vu8Z6wOzCImXZWAW0Y…

SpringBoot+Vue开发笔记

参考&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?p1 ----------------------------------------------------------概要总结---------------------------------------------------------- 1、MVC架构&#xff1a; View&#xff1a;与用户交互 Controller&…

解密外接显卡:笔记本能否接外置显卡?如何连接外接显卡?

伴随着电脑游戏和图形处理的需求不断增加&#xff0c;很多笔记本电脑使用者开始考虑是否能够通过外接显卡来提升性能。然而&#xff0c;外接显卡对于笔记本电脑是否可行&#xff0c;以及如何连接外接显卡&#xff0c;对于很多人来说仍然是一个迷。本文将为您揭秘外接显卡的奥秘…

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

无涯教程-jQuery - css( properties )方法函数

css(properties)方法将键/值对象设置为所有匹配元素的样式属性。 css( properties ) - 语法 selector.css( properties ) 上面的语法可以写成如下- selector.css( {key1:val1, key2:val2....keyN:valN}) 这是此方法使用的所有参数的描述- key:value - 设置为样式属…

【MySQL】复合查询

复合查询目录 一、基本查询二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 在from子句中使用子查询4.5 合并查询4.5.1 union4.5.2 union all 五、实战OJ 一、基本查询 --查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的…

【数据结构与算法——TypeScript】数组、栈、队列、链表

【数据结构与算法——TypeScript】 算法(Algorithm)的认识 解决问题的过程中&#xff0c;不仅仅 数据的存储方式会影响效率&#xff0c;算法的优劣也会影响效率 什么是算法&#xff1f; 定义&#xff1a; &#x1f7e2; 一个有限指令集&#xff0c;每条指令的描述不依赖于言语…

【音视频SDK测评】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点&#xff0c;需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外&#xff0c;此外&#xff0c;开发者还应关注音乐版权问题&#xff0c;确保开发的应用合规合法。 前言 前面写了几期关于直播 …

[STL]详解list模拟实现

[STL]list模拟实现 文章目录 [STL]list模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1迭代器区间构造函数拷贝构造函数赋值运算符重载析构函数 4. 迭代器及相关函数迭代器整体结构总览迭代器的模拟实现begin函数和end函数begin函数和end函数const版本 5. 数据…

C语言指针详解

C语言指针详解 字符指针1.如何定义2.类型和指向的内容3.代码例子 指针数组1.如何定义2.类型和内容 数组指针1.如何定义2.类型和指向类型3.数组名vs&数组名数组指针运用 数组参数&指针参数一维数组传参二维数组传参一级指针传参二级指针传参 函数指针1.如何定义2.类型和…

【前端知识】React 基础巩固(三十九)——React-Router的基本使用

React 基础巩固(三十九)——React-Router的基本使用 一、Router的基本使用 Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件。 Router包括两个API&#xff1a; BrowserRouter使用history模式 HashRouter使用hash模式&#xff08;路径后面带有#号…