碎碎念
上一章介绍了各种变量的定义和使用,这次要针对数字和文本这两种基本数据类型进行运算和判断了,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不为空,所以该条件为假
运算符虽然简单,但是是跳转结构,分支结构,循环结构——三大控制结构的基础
祝大家玩得开心