Linux shell 中的四则运算

Linux shell中执行echo 1+1的输出结果是1+1, 而非2。如果想输出2, 可以使用如下方法:

利用()

1
2
3
4
((i=$j+$k))     # 等价于   i=`expr $j + $k`
((i=$j-$k)) # 等价于 i=`expr $j -$k`
((i=$j*$k)) # 等价于 i=`expr $j \*$k`
((i=$j/$k)) # 等价于 i=`expr $j /$k` 取整

利用Let执行一个或多个表达式

1
2
3
4
5
let i=i+1    or let "i = i + 1" 

b=let 1 + 2

表达式中的变量前不必有$. 如果表达式中包含了空格或其他特殊字符, 则必须引起来。

Shell中常用的数学运算符如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
+:对两个变量做加法。
-:对两个变量做减法。
*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取余运算, 第一个变量除以第二个变量求余数。

+=:加等于, 在自身基础上加第二个变量。
-=:减等于, 在第一个变量的基础上减去第二个变量。
*=:乘等于, 在第一个变量的基础上乘以第二个变量。
/=:除等于, 在第一个变量的基础上除以第二个变量。
%=:取余赋值, 第一个变量对第二个变量取模运算, 再赋值给第一个变量。

利用expr改变运算顺序。

1
2
3
echo `expr 1 +2`
用expr表示后面的表达式为一个数学运算。
需要注意的是, `并不是一个单引号, 而是“Tab”键上面的那个符号。

$[]表示数学运算。

1
2
3
echo$[1+2]

将一个数学运算写到$[]符号的中括号中, 中括号中的内容将先进行数学运算。

下面是一个shell程序实例, 实现数学函数S=3(xy)+4x2+5y+6的运算。在程序中以位置变量的方式输入x与y的值。程序的编写步骤如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

#4.4.sh

s=0 #定义一个求和变量, 初值为0。

t=`expr$1**$2` #用expr改变运算顺序, 求x的y次方。
t=$[t*3] #t乘以3。
s=$[s+t] #结果相加。
t=$[$1**2] #求x的平方。
t=$[t*4] #结果乘以4。
s=$[s+t] #结果相加。
t=`expr$2*5` #求5y的值。
s=$[s+t] #结果相加。
s=$[s+6] #结果加上6。
echo$s #输出结果。
echo$((a%b)) #取余
# ./4.4.sh 2 4
# output: 90

利用 bc

1
variable=$(echo "OPTIONS; OPERATIONS" | bc)

bc命令,可以执行浮点运算和一些高级函数,比如:

1
echo "1.21*3" | bc

bc运算器有一个内建的变量scale,用于表示计算的精度,默认精度为0,所以除法运算的默认结果是整数
设定输出小数精度:

1
echo "scale=2;3/8" | bc

进制转换(将十进制转换成二进制):

1
2
3
#!/bin/bash
abc=192
echo "obase=2;$abc" | bc

将二进制转换为十进制:

1
2
3
#!/bin/bash
abc=11000000
echo "obase=10;ibase=2;$abc" | bc

计算平方和平方根:

1
2
echo "10^10" | bc
echo "sqrt(100)" | bc

甚至可以通过bc命令,进入一个交互式的环境,进行运算,然后通过quit命令退出
支持变量、自增、自减等操作

1
2
3
4
5
6
7
pie=3.14
r=3
pie*r*r
r++
--r

echo $(seq -s "+" 10)=`seq -s "+" 10|bc`


Copy from taijianyu