【shell漫步】2 运算符

碎碎念

上一章介绍了各种变量的定义和使用,这次要针对数字和文本这两种基本数据类型进行运算和判断了,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不为空,所以该条件为假

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

祝大家玩得开心

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Go语言的HTTP客户端进行并发请求

Go语言是一种高性能、简洁的编程语言,它非常适合用于构建并发密集型的网络应用。在Go中,标准库提供了强大的HTTP客户端和服务器功能,使得并发HTTP请求变得简单而高效。 首先,让我们了解为什么需要并发HTTP请求。在许多应用场景中…

「Verilog学习笔记」任意奇数倍时钟分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule clk_divider#(parameter dividor 5) ( input clk_in,input rst_n,output clk_out );parameter CNT_WIDTH $clog2(dividor - 1) ; reg flag1, f…

「Verilog学习笔记」编写乘法器求解算法表达式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule calculation(input clk,input rst_n,input [3:0] a,input [3:0] b,output [8:0] c);reg [8:0] data1, data2 ; assign c data2 ; always (posed…

基于ssm的订餐管理系统论文

基于JSP的订餐管理系统的设计与实现 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。传统的订餐信息管理模式,采用人工登记的方式保存相关数据,这种以人力为主的…

微同城本地小程序源码系统:顺风车+二手市场+跑腿功能+信息发布+广告功能 带完整的搭建教程

随着移动互联网的普及,小程序已成为各行业进行线上业务拓展的重要工具。微同城作为一款集顺风车、二手市场、跑腿功能、信息发布和广告功能于一体的本地小程序源码系统,旨在满足现代城市居民的多元化需求,提供一个方便、快捷、实用的服务平台…

Linkage Mapper 工具参数详解——Building Network and Map Linkages

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响,并介绍了如何解释模型输出结果和输出参数,适合刚入手的人。篇幅很长很啰嗦,是因为每个参数都解释的万分细致。 从以下链接中获取内容&#…

FPGA——VIVADO生成固化文件,掉电不丢失

VIVADO生成固化文件 (1)加入代码(2)生成bin文件,并且下载 (1)加入代码 设计文件(.xdc)中加入这段代码: set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property BITSTREAM.GENERAL.COMPRESS true [current_de…

【SpringBoot】-Spring MVC详解

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【Framework】 主要内容:SpringMVC项目的创建,关于使用SpringMVC框架前端传参和后端获取参数。关于SpringMVC框架后端返回数据的实战,如返回静…

1.2 ARCHITECTURE OF A MODERN GPU

图1.2显示了典型的支持CUDA的GPU架构的高级视图。它被组织成一系列高线程的流式多处理器(SM)。在图中1.2,两个SM构成一个 block。然而,构建块中的SM数量可能因代而异。此外,在图中,每个SM都有多个共享控制逻…

工作中人员离岗识别摄像机

工作中人员离岗识别摄像机是一种基于人工智能技术的智能监控设备,能够实时识别员工离岗状态并进行记录。这种摄像机通常配备了高清摄像头、深度学习算法和数据处理系统,可以精准地监测员工的行为,提高企业的管理效率和安全性。 工作中人员离岗…

医院信息系统集成平台—后台运维管理系统

随着信息化建设的推进,为了让凝聚了巨大人力物力投入的信息基础设施发挥出其效益,保障整个信息系统的平稳可靠运行,需要有一个可从整体上对包括服务器、网络,存储,安全等组件在内的IT基础设施环境进行综合管理的平台,并能够提供业务系统运行异常的实时告警和进行图形化问…

【Python】开始你的Python之旅(Anaconda、Pycharm、Jupyter)

Python工具准备 下载安装AnacondaPycharmJupyter Notebook 启动使用AnacondaPycharmJupyter Notebook 引言: 信息时代,计算机引领。人工智能,Python是基础。信息时代学习好Python乃是在人工智能时代的立足之本。 本文: 做好Pyth…

透明触摸屏展示柜的安装,需要注意什么

透明触摸屏展示柜的安装需要注意以下几个方面: 确定安装位置:选择一个合适的位置,确保展示柜的摆放位置合理,便于观看和管理。同时,要考虑到电源和信号线的连接,以及展示柜与周围环境的协调性。 检查透明触…

MYSQL多种提权方式

🐙MYSQL-提权条件 - 数据库的最高权限用户的密码 - secure-file-priv没进行目录限制 - 拿下了网站的权限(通过webshell或者其他方式) - 获取到了数据库的账号密码 (获取密码:D:/phpstudy/MySQL/data/mysql/user.MYD…

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

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

亚马逊用虚拟信用卡注册可以吗?

很多想做海外广告客户,由于想要投放Google、 Facebook广告,都需要虚拟信用卡,我们对信用卡研究也是有一定深入。但是,当在线购物或者邮件支付时,小伙伴们会担心信息的泄漏,而虚拟信用卡为付款创建了额外的安…

Android 集成vendor下的模块

Android 集成vendor下的模块 ,只需要在 PRODUCT_PACKAGES 加上对应的模块名,编译的时候就会执行对应模块的bp文件,集成到系统中 PRODUCT_PACKAGES \WallpaperPicker \Launcher3 \com.nxp.nfc Android11 Framework Vendor下自定义系统…

硬件开发避坑日志

FT232 串口工具会,多发和漏发0x00. 对比之下STC工具更稳定。 红外接收关 5 V 和 3.3V 工作电压的接收波形不一样。 3.3V工作不正常,接收不正常 。 5V工作是标准的NEC协议

一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…

自制java工具实现 ctrl+c+c 翻译鼠标选中文本

前言 本功能的实现基于这篇笔记 http://t.csdnimg.cn/1I8ln,本文阅读过程中有疑惑都可以查看此笔记 实现思路:检测到按压ctrl c c 后,获取当前剪切板文字,调用百度翻译api。 实现结果: 完整代码在最后 实现过程 1 监控…