【shell漫步】2 运算符

news2025/1/16 16:49:46

碎碎念

上一章介绍了各种变量的定义和使用,这次要针对数字和文本这两种基本数据类型进行运算和判断了,shell中的运算包括:

对数字类型

算术运算(对数字的 数学 运算)关系运算(用来做数字的条件判断)

对二元类型

布尔运算(对布尔值的 与或非 运算)逻辑运算(布尔值的条件判断)

对文本类型

字符串运算符(对字符串进行条件判断)

算术运算

在shell中直接使用算术运算符并不起效果,而是被当成字符串处理

想要处理算术运算就要使用expr函数,把要进行运算的变量或者数字放在expr后面,然后把expr和参与运算的全部内容用 $( ) 括起来,例如

+ - * /  分别对应了数学中的四则运算,shell中的空格很有讲究,= 不能够和空格一起,但是算术运算符必须用空格隔开,不用空格的话仍然是按照字符串处理,并且乘法要使用 \ 进行转义,非常鬼畜,正确的格式如下

c=$(expr $a + $b)

c=$(expr $a - $b)

c=$(expr $a \* $b)

c=$(expr $a / $b)

除此之外还有取模运算使用 % 表示

c=$(expr $a % $b)

关系运算

数学中有两个基本的主题——计算 和 比较(或者说条件判断,这种说法在编程中是更主流)

上一节讲的是shell中的数学计算,这会得到一个结果,把结果和一个预期值进行对比,这就是比较,在shell中对数字的比较要使用到关系运算符

判断a是否等于b
[$a -eq $b]

判断a和b是否不相等
[$a -nq $b]

判断a是否小于b
[$a -lt $b]

判断a是否小于等于b
[$a -le $b]

判断a是否大于b
[$a -gt $b]

判断a是否大于等于b
[$a -ge $b]

以上的判断条件的结果只有真和假两种

布尔值

布尔值是一个集合中,假设为集合(0 1),所有元素的总数只有2个,他满足排中律(不会出现介于0和1之间的值)和矛盾律(如果不是0那一定就是1),计算机领域中一般用bool或者boolean表示,他的取值是true 和 false,或者0 和 1

在shell中,0 代表 真,1 代表 假

回到本文 碎碎念 的部分中,我把所有的运算符根据运算对象分成3类,这些运算符可以分为专门针对数字,字符串和二元值进行操作的3大类,而每一类中都有一种条件判断用的运算符

为什么要区分计算和条件判断,条件判断是什么时候用的?

首先计算的目的只有三个

一个是作为下一次操作的参数被传入,不管是传入函数还是输入到文本,这一般是内部完成就行了;一个是作为结果输出给用户看;还有一个就是令其成为判断用的条件

其次,最基本的程序是满足从上到下依次执行,而且是全部执行,单次执行的

顺序执行:第一步做完才做第二步,不会先做下一步再做上一步

全部执行:所有的步骤都会执行,不会跳过

单次执行:不会执行0次但最多只执行1次

而实际的编程中根据现实需要的不同,肯定会违反上面的三个条件的任意一个

这时候就要用到 控制语句 

为了违反三个执行准则,出现了三种控制语句:这也会是下一章的重点

违反顺序执行: 使用跳转机制,最常见的就是 函数定义和引用,模板嵌套等,可以使程序执行跳来跳去

违反全部执行:使用条件分支结构

违反单次执行:使用循环结构

为了可以看测试用例的结果,本章会使用一个最简单的 条件分支结构 

if [ 判断条件 ]
then
    代码
fi

意思就是如果 [ ] 中的条件结果为真,那么就执行 代码  的部分

以上面的

判断a是否等于b
[$a -eq $b]

为例子,[$a -eq $b] 就是一个判断条件,把判断条件放在 if 后面,如果a的值等于b的话判断结果就是 真

布尔运算

针对布尔值的运算符号只需要了解取反符号即可

在一个布尔值前面加上 ! 就可以让他变成相反的值

假设 a=true 则 !a == false

a=false 则 !a == true

这一条在判断条件的时候也适用

例如 a=0 然后进行判断,  if [ $a -eq 0 ]  那么条件就是真,会执行接下来的代码

如果我写成  if [ ! $a -eq 0 ]  整个条件就会取反变成假,就不会执行接下来的代码

逻辑运算

现实情况中判断条件有可能在1个以上,多个条件之间的真假判断就要使用逻辑运算符

或 运算
当下述的条件1和条件2 只要有一个为真 的时候,结果就是 真
[ 条件1 ] || [ 条件2 ]

与 运算
当下述的条件1和条件2 全部为真 的时候,结果才是 真
[ 条件1 ] && [ 条件2 ]

同样 假设 a=5,输出结果如下,使用 || 的时候,两个条件一对一错,结果是对

使用 && 的时候,两个条件一对一错,结果是错

字符串运算

字符串的运算符只要记住两个就行

一个是判断字符串是否相等,使用 =

一个是判断字符串是否为空,使用 -z

比如 设 name=me

if [ $name = "me" ] 因为name和me字符串相等,则为真

if [ -z $name ] 因为name不为空,所以该条件为假

运算符虽然简单,但是是跳转结构,分支结构,循环结构——三大控制结构的基础

祝大家玩得开心

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

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

相关文章

力扣-42.接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组[0,1,0,2…

GraphQL 工具推荐:打造高效的开发环境

GraphQL 工具 本文章,会列举一些好用的 GraphQL 工具,他们可以大大提升你在开发中使用 GraphQL 的效率哦! Prisma 你可以这么理解,Prisma 是一个 ORM 的库,让你使用 GraphQL 查询时,可以使用对象的形式去…

图像分割-Grabcut法

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的C#版本请访问:图像分割-Grabcut法(C#)-CSDN博客 GrabCut是一种基于图像分割的技术,它可以用于将图像…

vue中key的用法

加key是提升vue渲染效率,减少DOM操作。 vue列表元素的更新机制: 当列表元素没有设置key的时候,vue判断是否操作这个DOM元素,是根据新旧两次数据的元素顺序进行对比,看一下元素内容是否发生变化。发生变化vue就操作这个…

关于Python里xlwings库对Excel表格的操作(二十八)

这篇小笔记主要记录如何【如何使用“Chart类”和“Api类"为新图表设置标题文本内容、字体、字号、粗细、正斜、颜色】。 前面的小笔记已整理成目录,可点链接去目录寻找所需更方便。【目录部分内容如下】【点击此处可进入目录】 (1)如何…

大数据Doris(四十六):物化视图查询改写和适用场景

文章目录 物化视图查询改写和适用场景 一、查询改写

移动神器RAX3000M路由器不刷固件变身家庭云之六(高级应用):设置https

本系列文章: 移动神器RAX3000M路由器变身家庭云之一:开通SSH,安装新软件包 移动神器RAX3000M路由器变身家庭云之二:安装vsftpd 移动神器RAX3000M路由器变身家庭云之三:外网访问家庭云 移动神器RAX3000M路由器变身家庭云…

c# 学习笔记 - 枚举

文章目录 1. 枚举1.1 枚举结构梳理1.2 枚举完整代码1.3 枚举知识点补充 2. 迭代两种命名空间接口3. yield语句 1. 枚举 1.1 枚举结构梳理 结构图   上图内容可能依旧不通俗易懂,这里使用最简明的话语告诉大家实现方式. foreach语句就是集合的遍历操作&#xff0c…

彻底弄懂MySQL事务隔离级别

并发事务中存在以下 3 个问题。 1 脏读 指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会保存到数据库,也可能会回滚,不保存到数据库。当这个数据发生了回滚,就意味着读到的这个数据不存在,这就是脏读! 2 不可重复读 在同一个事务中,同一个查询在不同的…

Spring Cloud Alibaba 介绍与版本映射关系

目录 前言 一、Spring Cloud Alibaba 是什么? 二、Spring Cloud Alibaba 版本依赖 前言 Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,这套规范共有两代实现。 (子项目): ● 第一代实现: Spr…

yolov5旋转目标检测-遥感图像检测-无人机旋转目标检测(附代码和原理)

目前,无人机技术的快速发展带来了遥感图像处理领域的革命性改变。然而,由于无人机在飞行时可能会出现旋转的情况,因此对于旋转目标的检测也成为了一个重要的问题。针对这个问题,yolov5可以提供一种高效的解决方案。 以下是介绍的分…

SSCI及SCI撰写|查找文献doi的八大方法

一、前言 (一)文献DOI概念介绍 DOI(Digital Object Identifier)是一种用于标识数字对象的持久性标识符系统。在学术出版领域,DOI通常用于标识和定位学术文献,包括期刊文章、会议论文、报告等。以下是 DOI 的一些重要特点和介绍&a…

法二(命令行):YOLOv5打包.exe

0 准备工作 yolov5环境配置完毕安装pyinstaller,命令为 pip install pyinstallerps: 为了避免可能的错误,所有操作请在英文路径下进行。 1 修改detect_qt5.py或者相关文件 如果是使用我的检测界面的,应该是修改detect_qt5.py这个文件&#x…

HTTP和TCP代理原理及实现,主要是理解

Web 代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web 代理无处不在。我之前有关 HTTP 的博文中,多次提到了代理对 HTTP 请求及响应的影响。今天这篇文章,我打算谈谈 HTTP 代理本身的一些原理,…

springboot中引入AOP切面编程

在Spring Boot 3.0中引入AOP的过程如下所示&#xff1a; 1、首先&#xff0c;确保已经添加了相关依赖。可以通过Maven或Gradle来管理项目的依赖。对于使用Maven构建的项目&#xff0c;需要将以下依赖添加到pom.xml文件中 <dependency><groupId>org.springframewo…

Optional 优雅判空

文章目录 可以解决的问题API介绍Optional(T value),empty(),of(T value),ofNullable(T value)orElse(T other)&#xff0c;orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)map(Function<? super T, ? exten…

Linux第8步_USB设置

学习完设置“虚拟机的电源”后&#xff0c;接着学习通过鼠标点击操作U盘&#xff0c;目的是了解USB设置。 1、在桌面&#xff0c;双击“VMware Workstation Pro”图标&#xff0c;得到下图&#xff1a; 2、点击“编辑虚拟机”&#xff0c;得到下图&#xff1a; 只要点击编辑虚…

03 decision tree(决策树)

一、decision tree&#xff08;决策树&#xff09; 1. classification problems&#xff08;纯度&#xff09; i . entropy &#xff08;熵&#xff09; ​ 作用&#xff1a;衡量一组数据的纯度是否很纯 &#xff0c;当五五开时他的熵都是最高的&#xff0c;当全是或者都不是…

【数据结构】——期末复习题库(6)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【bug】【VSCode】远程终端TERMINAL打不开

【bug】【VSCode】远程终端TERMINAL打不开 可能的原因现象分析解决 可能的原因 昨天晚上vscode在打开多个TERMINAL的情况下&#xff0c;挂了一晚上&#xff0c;今早上来看的时候全都lost connections…。然后关闭再打开就出现了如上现象。 早上一来到实验室就要debug… 现象…