Linux 执行数学运算
shell 处理数学运算是个很复杂的过程。一般有两种方法:
- expr 命令
- 使用方括号
zzz@ubuntu:~/my_learning$ expr 1+1
1+1
zzz@ubuntu:~/my_learning$ expr 1 + 1
2
zzz@ubuntu:~/my_learning$ expr 1 * 1
expr: 语法错误:未预期的参数 “test.sh”
zzz@ubuntu:~/my_learning$ expr 1 \* 1
1
zzz@ubuntu:~/my_learning$ $[1 * 1]
1:未找到命令
zzz@ubuntu:~/my_learning$ a=$[1 * 1]
zzz@ubuntu:~/my_learning$ echo $a
1
zzz@ubuntu:~/my_learning$ ^C
zzz@ubuntu:~/my_learning$
zzz@ubuntu:~/my_learning$ a=$[3 / 2]
zzz@ubuntu:~/my_learning$ echo $a
1
zzz@ubuntu:~/my_learning$
可以看到在执行运算时,要注意运算符两边的空格。expr 计算时,由于一些运算符可能被赋予了其他含义。因此,有时需要使用 \ 进行转义。所以使用 $[ ] 可以更方便的执行运算,运算符不会被识别为其它含义。
但是,以上介绍的运算操作有一个问题。只能处理整数运算,不支持浮点数。
常见的方式是使用内建的计算器bc。
bc
类似于一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式,最后返回计算结果。bash计算器支持:
- 数字
- 变量
- 注释
- 表达式
- 编程语言
- 函数
zzz@ubuntu:~/my_learning$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
a=2
b=3
a / b
0
scale
0
scale=2
scale
2
a / b
.66
quit
zzz@ubuntu:~/my_learning$
在脚本中使用bc
zzz@ubuntu:~/my_learning$ a=2
zzz@ubuntu:~/my_learning$ variable=`echo "scale=2; $a/3" | bc`
zzz@ubuntu:~/my_learning$ echo $variable
.66
zzz@ubuntu:~/my_learning$
当需要涉及大量的运算时,可以使用内联输入重定向。EOF文本字符串标识了内联重定向数据的起止。bc 中可以使用shell中定义的变量,用 $ 标识。bc 中也可以定义变量,使用时不需要 $ 标识。bc中定义的变量,bc结束后,shell不能使用。
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
a=2
variable=$( bc << EOF
scale=2
b=3
c = ($a / b)
c
EOF
)
echo The result: $variable
zzz@ubuntu:~/my_learning$ ./test.sh
The result: .66
zzz@ubuntu:~/my_learning$