shell中变量的操作都是按照字符串处理的,如果直接对变量用+、-、*、/等符号运算,结果往往是不预期的,如下:
#! /bin/bash
v1=10
v2=20
echo $v1+$v2
echo $v1-$v2
echo $v1*$v2
echo $v1/$v2
执行结果:
在bash shell中对于数值运算有多种方式,本文简单说明3种:let、$(())、expr
算术运算let
let只适合整形运算,如果是浮点数会报错,整数除法的话是取模运算;let的使用方式有点类c,并且也支持++,--等运算符(包括逗号)下面给个示例,不写测试代码了,直接在命令行窗口执行,这样看的也比较清楚:
$(())
$((算术表达式)),实际使用((算术表达式)),如:((1+2))便会计算1+2,可是如果前面不加$符号,计算的结果没法赋值给别的变量,这也是没有意义,所以这里的写法就认为$((算术表达式))。
变量=$((算术表达式))可以等同于let 变量算术表达式,如sum=$((1+2))等同于let sum=1+2。即$(())可以代替let命令。同样,它也只能进行整数计算,不能计算浮点数,示例如下:
看图片的最后几行,和let的写法毕竟有点不一样,所以要注意++、--运算符的前后位置(和c语言一样),以及根据自己的使用目的来达到预期效果。
expr
expr命令的功能比较复杂,这个是实实在在的命令,可以计算整数,截取字符串,计算字符串长度,全部用法建议查看帮助文件,下面给个示例,注意运算数和运算符之前的空格,否则就作为一个字符串处理了,因此不支持++、--等运算符:
#! /bin/bash
#计算1+2
echo `expr 1 + 2`
#没有空格当作字符串
echo `expr 1+2`
#计算字符串长度
echo `expr length "abcd"`
#不支持浮点数,报错
echo `expr 3.5 * 2`
执行结果,如下:
p.s. 如果要做浮点数运算或者开方求幂等高端操作,可以考虑用bc命令,如下:
其它用法,如有需要可以查看帮助文档。