【shell漫步】2 运算符

发布时间:2024年01月05日

碎碎念

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

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

祝大家玩得开心

文章来源:https://blog.csdn.net/andyshi1998/article/details/135400186
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。