算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。Shell中常用的数学运算符如下所示。
+:对两个变量做加法。
–:对两个变量做减法。
*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取模运算,第一个变量除以第二个变量求余数。
+=:加等于,在自身基础上加第二个变量。
-=:减等于,在第一个变量的基础上减去第二个变量。
*=:乘等于,在第一个变量的基础上乘以第二个变量。
/=:除等于,在第一个变量的基础上除以第二个变量。
%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。
在使用这些运算符时,需要注意到运算顺序的问题。例如输入下面的命令,输出1+2的结果。
echo 1+2
Shell并没有输出结果3,而是输出了1+2。在shell中有三种方法可以更改运算顺序。
1、用expr改变运算顺序。可以用echo expr 1 +2
来输出1+2的结果,用expr表示后面的表达式为一个数学运算。需要注意的是,`并不是一个单引号,而是“Tab”键上面的那个符号。
[root@ansible test]# echo `expr 1 + 2`
3
2、用let指示数学运算。可以先将运算的结果赋值给变量b,运算命令是let m=1+2。然后用echo$m来输出m的值。如果没有let,则会输出1+2。
[root@ansible test]# let m=5+4
[root@ansible test]# echo $m
9
[root@ansible test]# m=1+2
[root@ansible test]# echo $m
1+2
3、用 []符号的中括号中,中括号中的内容将先进行数学运算。例如命令echo$[1+2],将输出结果3。
[root@ansible test]# echo $[5+4]
9
[root@ansible test]# b=$[5+4]
[root@ansible test]# echo $b
9
[root@ansible test]# echo $[1.5*3] #带小数不适用
-bash: 1.5*3: 语法错误: 无效的算术运算符 (错误符号是 ".5*3")
[root@ansible test]# echo $[1.5+3]
-bash: 1.5+3: 语法错误: 无效的算术运算符 (错误符号是 ".5+3")
4、bc命令是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。
[root@ansible test]# echo "1+2"
1+2
[root@ansible test]# echo "1+2"|bc
3
[root@ansible test]# m='1+2'
[root@ansible test]# echo $m
1+2
[root@ansible test]# echo $m|bc
3
[root@ansible test]# m=1+2
[root@ansible test]# echo $m|bc
3
[root@ansible test]# echo 'scale=2;2/3'|bc #scale=2表示设置小数位为2位
.66
[root@ansible test]# echo 'scale=2;5/3'|bc
1.66
[root@ansible test]# echo '1.5*3'|bc
4.5
[root@ansible test]# m=1.5*3
[root@ansible test]# echo $m|bc
4.5
[root@ansible test]# echo '1.55*3.1'|bc #默认为两位小数
4.80
[root@ansible test]# echo 'scale=5;1.55*3.1'|bc
4.805
下面是简单的脚本例子,此例子只是展示运算方法,并不是合适的运算方法:
#!/bin/bash
echo '输入第一个数字:'
read a
echo '输入第二个数字:'
read b
echo '运算结果如下:'
expr $a + $b &> /dev/null
if [ $? -eq 0 ];then #借此判断a、b是否全是整数
echo "$a+$b="$[a+b]
echo "$a-$b="$[a-b]
echo "$a*$b="$[a*b]
echo "$a/$b="$[a/b]
echo "$a%$b="$[a%b]
echo -n "$a/$b="&&awk 'BEGIN{printf "%.5f\n",'$a' / '$b'}'
else
echo -n "$a+$b="&&echo "$a+$b"|bc
echo -n "$a-$b="&&echo "$a-$b"|bc
echo -n "$a*$b="&&echo "scale=5;$a*$b"|bc
echo -n "$a/$b="&&echo "scale=5;$a/$b"|bc
fi