文章目录(Table of Contents)
简介
本文是介绍 Shell 编程的第三篇文章,前两篇文章中,我们分别介绍了Bash 入门和Bash 变量。本文会介绍 bash 中的各种各种运算方式、运算符号以及使用相关的运算命令。本文会介绍以下的内容:
- 运算命令(
expr
,(())
运算,let
运算) - 运算符(四则运算,逻辑运算符,关系运算符)
运算命令
Linux
中字符是不能直接进行运算的,例如我们想完成一个最简单的加法运算,我们运行一个如下的脚本:
- a=1+1
- echo $a
最终的结果如下所示,可以看到 Shell
将 1+1
看作了普通的字符串:
如果我们想要完成运算,需要借助一些命令才能进行计算,常用的命令有:
expr
, 可用于整数运算,为内置命令来自于Unix
;$[ ]
, 简单算术运算,是较老版本;(( ))
, 用于简单算术运算,bash
中的算术扩展,是$[]
的升级版(推荐使用);let
, 运行简单的运算同时赋给变量,为内置命令declare
, 定义变量值和属性,-i 参数可用于赋值给变量一个整数属性bc
,Linux
下的计算器程序,整数运算及小数运算,需要额外安装
我们这里会介绍上面的 expr
,(())
,let
这三者的使用。其中我个人是比较推荐使用 (())
的。
expr 命令
expr
是一个非常古老的命令,来自于早期的 Unix
系统,十分简单的一个命令。下面是使用 expr
完成一个加法运算(在 expr
中是没有小数运算的,也就是浮点数运算):
使用该命令的时候一定要注意其格式,因为它是通过参数的逐步读取来获取每一步需要的操作,所以参数之间的空格不要忘记,例如:
- # 中间有间隔
- expr 1 + 1
- # 中间没有间隔视为一个参数,得不到我们想要的结果
- expr 1+1
第一个是有间隔的,第二个没有间隔。我们运行上面的程序可以看到,第一个有间隔才可以得到想要的结果:
(()) 运算命令
(())
是 $[]
的升级版。$[]
是非常早期的 bash
语法,其处理能力和功能性上的弱势使得人们对其功能进行了优化增强,从而出现了 (())
,官方更多地推荐大家使用 (())
,淘汰 $[]
,后者的存在只是为了让一些老版本的脚本不会报错而保留。
而 (())
与 expr
相比更人性化,我们不必再考虑空格的存在,例如上面的 expr 1+1
是不会进行运算的,但是这里 ((1+1))
可以进行运算:
同时使用 (())
去改变变量值的时候也会更加简单,不需要使用 $
符号。下面我们比较 (())
和 expr
这两个方法的区别( 使用 expr
并且没有办法为变量赋值,只会输出运算结果 ):
- a=0
- # expr 无法为变量赋值
- expr $a + 1
- echo 'After expr' $a
- ((a=a+1))
- echo 'After (())' $a
最终的结果如下图所示,expr
是无法为变量赋值的:
let 命令
let
命令可以说是 (())
的命令版本,在 (())
中如果不知道可用的参数,可以直接查看 let
的参数介绍。 let
是内建命令,若是想看其参数介绍需要用 help let
。
let
与直接使用 (())
一样,表达式执行之后是没有结果返回的,要想看到 let
执行的效果需要通过变量去查看。运行下面的脚本,会得到结果 1.
- # let 不会有结果打印
- let 1+1
- # 定义变量来验证
- b=0
- let b++
- echo $b
运算符
上面我们介绍了 Shell
中的运算命令,这里来介绍运算符。这里的内容因为比较简单,故我们快速把所有知识点都过一遍。
四则运算符
这里的四则运算就是我们数学中的四则运算。下面我们用一个脚本快速介绍一下:
这里需要使用 zsh
运行而不是 bash
,bash
不支持小数的运算。最终的结果如下所示:
逻辑运算符
逻辑运算符主要就是与、或、非三种,大家之前应该都接触过:
- 非(以该符号表示:
!
):相反的意思,真反过来就是假,假反过来就是真; - 与(以该符号标示:
&
):并且的意思,也就是 a 为真并且 b 为真,这样整体才是真,有一个假整体都是假; - 或(以该符号标示:
|
):或者的意思,也就是 a 为真或者 b 为真,只要其中一个是真整体就是真的。
在 Shell 的值运算中并没有非的使用,主要是 &
与 |
。
运算符 &
:在运算中使用 &
,当两个值都不为 0
的时候取前者,即 &
左边的值。否则值为 0:
- # 两者都不为 0,取值前者,1
- expr 1 \& 2
- # 后者为 0,值为 0
- expr 2 \& 0
运算符 |
:在运算中使用 |
,当第一个值不为 0
的时候取前者,否则值为后者:
- # 两者都不为 0,取值前者,2
- expr 2 \| 1
- # 前者值为 0,取值后者,1
- expr 0 \| 1
关系运算符
关系运算符就是常见的 >
,<
,<=
,>=
,=
。下面是几个简单的例子,为了避免歧义,这里都使用了转义符:
- # 1 小于 2,成立返回 1
- expr 1 \< 2
- # 1 大于 2,不成立返回 0
- expr 1 \> 2
- # 3 等于 2,不成立返回 0
- expr 3 = 2
- # 4 小于等于 2,不成立返回 0
- expr 4 \<= 2
返回 1
表示成立,返回 0
表示不成立。
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论