4

Bash 基本运算

 2 years ago
source link: https://mathpretty.com/14592.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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. # expr 无法为变量赋值
  2. expr $a + 1
  3. echo 'After expr' $a
  4. ((a=a+1))
  5. echo 'After (())' $a

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

Bash 基本运算

let 命令

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

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

  1. # let 不会有结果打印
  2. let 1+1
  3. # 定义变量来验证
  4. let b++
  5. 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 表示不成立。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK