Shell | 数值运算
Shell 和其它编程语言不同,Shell 不能直接进行算数运算,必须使用数学计算命令
Shell 中常用的数学计算命令如下所示:
-
$((expression))
操作符:可以进行基本的整数运算。 -
let
:对整数进行数学运算,类似于$((expression))
操作符。 -
expr
:可以进行基本的整数运算,如加减乘除、取模等。 -
bc
:可以进行任意精度的数值运算,包括整数和浮点数运算。
$((expression))
操作符
$((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
# 计算(2+3)* 4 的值
$ S=$[(2+3)*4]
$ echo $S
$((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
参数用于控制浮点数的小数位数。