Bash 基本运算

王 茂南 2022年2月20日07:00:36
评论
2034字阅读6分46秒
摘要本文主要是介绍 Bash 中的运算命令(expr,(()) 运算,let 运算)和运算符(四则运算,逻辑运算符,关系运算符)。

简介

本文是介绍 Shell 编程的第三篇文章,前两篇文章中,我们分别介绍了Bash 入门Bash 变量。本文会介绍 bash 中的各种各种运算方式、运算符号以及使用相关的运算命令。本文会介绍以下的内容:

  • 运算命令(expr(()) 运算,let 运算)
  • 运算符(四则运算,逻辑运算符,关系运算符)

 

运算命令

Linux 中字符是不能直接进行运算的,例如我们想完成一个最简单的加法运算,我们运行一个如下的脚本:

  1. a=1+1
  2. echo $a

最终的结果如下所示,可以看到 Shell1+1 看作了普通的字符串:

Bash 基本运算

如果我们想要完成运算,需要借助一些命令才能进行计算,常用的命令有:

  • expr, 可用于整数运算,为内置命令来自于 Unix
  • $[ ], 简单算术运算,是较老版本;
  • (( )), 用于简单算术运算,bash 中的算术扩展,是 $[] 的升级版(推荐使用);
  • let, 运行简单的运算同时赋给变量,为内置命令
  • declare, 定义变量值和属性,-i 参数可用于赋值给变量一个整数属性
  • bc, Linux 下的计算器程序,整数运算及小数运算,需要额外安装

我们这里会介绍上面的 expr(())let 这三者的使用。其中我个人是比较推荐使用 (()) 的。

 

expr 命令

expr 是一个非常古老的命令,来自于早期的 Unix 系统,十分简单的一个命令。下面是使用 expr 完成一个加法运算(在 expr 中是没有小数运算的,也就是浮点数运算):

Bash 基本运算

使用该命令的时候一定要注意其格式,因为它是通过参数的逐步读取来获取每一步需要的操作,所以参数之间的空格不要忘记,例如:

  1. # 中间有间隔
  2. expr 1 + 1
  3. # 中间没有间隔视为一个参数,得不到我们想要的结果
  4. expr 1+1

第一个是有间隔的,第二个没有间隔。我们运行上面的程序可以看到,第一个有间隔才可以得到想要的结果:

Bash 基本运算

 

(()) 运算命令

(())$[] 的升级版。$[] 是非常早期的 bash 语法,其处理能力和功能性上的弱势使得人们对其功能进行了优化增强,从而出现了 (()),官方更多地推荐大家使用 (()),淘汰 $[],后者的存在只是为了让一些老版本的脚本不会报错而保留。

而 (()) 与 expr 相比更人性化,我们不必再考虑空格的存在,例如上面的 expr 1+1 是不会进行运算的,但是这里 ((1+1)) 可以进行运算:

Bash 基本运算

同时使用 (()) 去改变变量值的时候也会更加简单,不需要使用 $ 符号。下面我们比较 (())expr 这两个方法的区别( 使用 expr 并且没有办法为变量赋值,只会输出运算结果 ):

  1. a=0
  2. # expr 无法为变量赋值
  3. expr $a + 1
  4. echo 'After expr' $a
  5. ((a=a+1))
  6. echo 'After (())' $a

最终的结果如下图所示,expr 是无法为变量赋值的:

Bash 基本运算

 

let 命令

let 命令可以说是 (()) 的命令版本,在 (()) 中如果不知道可用的参数,可以直接查看 let 的参数介绍。 let 是内建命令,若是想看其参数介绍需要用 help let

let 与直接使用 (()) 一样,表达式执行之后是没有结果返回的,要想看到 let 执行的效果需要通过变量去查看。运行下面的脚本,会得到结果 1.

  1. # let 不会有结果打印
  2. let 1+1
  3. # 定义变量来验证
  4. b=0
  5. let b++
  6. echo $b

 

运算符

上面我们介绍了 Shell 中的运算命令,这里来介绍运算符。这里的内容因为比较简单,故我们快速把所有知识点都过一遍。

四则运算符

这里的四则运算就是我们数学中的四则运算。下面我们用一个脚本快速介绍一下:

Bash 基本运算

这里需要使用 zsh 运行而不是 bashbash 不支持小数的运算。最终的结果如下所示:

Bash 基本运算

 

逻辑运算符

逻辑运算符主要就是与、或、非三种,大家之前应该都接触过:

  • 非(以该符号表示:!):相反的意思,真反过来就是假,假反过来就是真;
  • 与(以该符号标示:&):并且的意思,也就是 a 为真并且 b 为真,这样整体才是真,有一个假整体都是假;
  • 或(以该符号标示:|):或者的意思,也就是 a 为真或者 b 为真,只要其中一个是真整体就是真的。

在 Shell 的值运算中并没有非的使用,主要是 & 与 | 。

运算符 &:在运算中使用 &,当两个值都不为 0 的时候取前者,即 & 左边的值。否则值为 0:

  1. # 两者都不为 0,取值前者,1
  2. expr 1 \& 2
  3. # 后者为 0,值为 0
  4. expr 2 \& 0

运算符 |:在运算中使用 |,当第一个值不为 0 的时候取前者,否则值为后者:

  1. # 两者都不为 0,取值前者,2
  2. expr 2 \| 1
  3. #  前者值为 0,取值后者,1
  4. expr 0 \| 1

 

关系运算符

关系运算符就是常见的 ><<=>==。下面是几个简单的例子,为了避免歧义,这里都使用了转义符:

  1. # 1 小于 2,成立返回 1
  2. expr 1 \< 2
  3. # 1 大于 2,不成立返回 0
  4. expr 1 \> 2
  5. # 3 等于 2,不成立返回 0
  6. expr 3 = 2
  7. # 4 小于等于 2,不成立返回 0
  8. expr 4 \<= 2

返回 1 表示成立,返回 0 表示不成立。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2022年2月20日07:00:36
  • 转载请务必保留本文链接:https://mathpretty.com/14592.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: