Shell | 数值运算

发布时间 2023-07-03 13:43:34作者: 张Zong在修行

Shell 和其它编程语言不同,Shell 不能直接进行算数运算,必须使用数学计算命令

Shell 中常用的数学计算命令如下所示:

  • $((expression)) 操作符:可以进行基本的整数运算。

  • let:对整数进行数学运算,类似于 $((expression)) 操作符。

  • expr:可以进行基本的整数运算,如加减乘除、取模等。

  • bc:可以进行任意精度的数值运算,包括整数和浮点数运算。

$((expression)) 操作符

$((expression)) 操作符可以进行基本的整数运算。语法格式就是:$((expression))这种格式。

例如:

$ echo $((1 + 2))
3
$ echo $((1+2))
3
$ echo $((10 - 5))
5
$ echo $((3 * 4))
12
$ echo $((10 / 3))
3
$ echo $((10 % 3))
1

$((expression))操作符中,运算符和操作数之间可以用空格隔开,也可以不用空格隔开。

上面的例子只是说明这样可以运算,但是是否可以把计算出来的值进行赋值啊?

$ a=$((2 + 2))
$ echo $a
4

我们可以通过这样的方式进行赋值。

let 命令

let 命令可以进行基本的整数运算,类似于 $((expression)) 操作符。let 命令只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

let 命令的语法格式为

let 表达式
或者
let "表达式"
或者
let '表达式'

例如:

# 说明,如果使用 `let 表达式` 这样的命令,`a=1+2`表达式之间不能有空格。也就是说运算符和操作数之间不能用空格隔开
$ let a=1+2
$ echo $a
3

# 使用 `let "表达式"` 命令
$ let "b=1+2"
$ echo $b
3

# 使用 `let '表达式'` 命令
$ let 'c=1+2'
$ echo $c
3

# 使用 `let "表达式"`或`let '表达式'` 命令时,`'d = 1 + 2'`表达式之间可以有空格。也就是说运算符和操作数之间可以用空格隔开。
$ let 'd = 1 + 2'
$ echo $d
3

# let 命令支持一次性计算多个表达式
$ let aa=1+2 bb=2+3
$ echo $aa $bb
3 5

let还可以进行其他运算符的计算:

$ let "a = 1 + 2"
$ echo $a
3
$ let "b = 10 - 5"
$ echo $b
5
$ let "c = 3 * 4"
$ echo $c
12
$ let "d = 10 / 3"
$ echo $d
3
$ let "e = 10 % 3"
$ echo $e
1

expr 命令

expr 命令可以进行基本的整数运算,如加减乘除、取模等。也可以处理字符串。

expr 命令的语法格式为

# expr 命令的语法格式中,运算符和操作数之间必须用空格隔开
$ expr 1 + 2
3

$ expr 1+2
1+2

# 而且不支持像let命令中表达式可以加`""`或`''`
$ expr "1+2"
1+2

$ expr "1 + 2"
1 + 2

# expr 命令中的乘号 * 需要用反斜杠 \ 转义
$ expr 3 * 4
expr: 语法错误

$ expr 3 \* 4
12

例如:

$ expr 1 + 2
3
$ expr 10 - 5
5
$ expr 3 \* 4
12
$ expr 10 / 3
3
$ expr 10 % 3
1

bc 命令

bc 命令可以进行任意精度的数值运算,包括整数和浮点数运算。

例如:

$ echo "10 + 5" | bc
15
$ echo "3 * 4" | bc
12
$ echo "scale=2; 10 / 3" | bc
3.33

其中,"3 * 4" | bc中的|两边可以不加空格。bc 命令中的 scale 参数用于控制浮点数的小数位数。