[TOC]
# Shell变量的数值计算
shell变量的数值计算常见的有如下几个命令:`(())`、`let`、`expr`、`bc`、`$[]`。
## `(())`用法举例,执行简单的整数运算,只需将特定的算术表达式
~~~
[luo@LNMP-CenOS-6.5 ~]
$ a=$((1+2**3-4%3)) # **为取幂运算
[luo@LNMP-CenOS-6.5 ~]
$ echo $a
8
[luo@LNMP-CenOS-6.5 ~]
$ echo $((a+=1)) # 相当于a=a+1
9
[luo@LNMP-CenOS-6.5 ~]
$ echo $((a))
10
[luo@LNMP-CenOS-6.5 ~]
$ echo $((a--)) # 先赋值,再--
10
[luo@LNMP-CenOS-6.5 ~]
$ echo $((a))
9
[luo@LNMP-CenOS-6.5 ~]
$ echo $((3>2))
1
[luo@LNMP-CenOS-6.5 ~]
$ echo $((3<2))
0
[luo@LNMP-CenOS-6.5 ~]
$ echo $((100*(100+1)/2))
5050
~~~
又如:
~~~
[luo@LNMP-CenOS-6.5 ~]
$ cat sh.sh
#/bin/bash
_1=$1
__=$2
echo " ${_1} + ${__} = " $(($_1+$__))
echo " ${_1} * ${__} = " $(($_1*$__))
echo " ${_1} - ${__} = " $(($_1-$__))
echo " ${_1} / ${__} = " $(($_1/$__))
echo " ${_1} ** ${__} = " $(($_1**$__))
echo " ${_1} % ${__} = " $(($_1%$__))
[luo@LNMP-CenOS-6.5 ~]
$ bash sh.sh 12 3
12 + 3 = 15
12 * 3 = 36
12 - 3 = 9
12 / 3 = 4
12 ** 3 = 1728
12 % 3 = 0
~~~
小实例:使用shell实现计算器的功能
~~~
[luo@LNMP-CenOS-6.5 ~]
$ cat calc.sh
#/bin/bash
echo $(($1 $2 $3))
[luo@LNMP-CenOS-6.5 ~]
$ ./calc.sh 2+3
5
~~~
## let用法
格式: `let 赋值表达式`
功能等同于`(())` 赋值表达式
~~~
[luo@LNMP-CenOS-6.5 ~]
$ i=2
[luo@LNMP-CenOS-6.5 ~]
$ i=i+8 # 此时等号右边无法计算,我们可以使用 $((i+8))进行计算
[luo@LNMP-CenOS-6.5 ~]
$ echo $i
i+8
[luo@LNMP-CenOS-6.5 ~]
$ i=2
[luo@LNMP-CenOS-6.5 ~]
$ let i=i+8 # let的作用
[luo@LNMP-CenOS-6.5 ~]
$ echo $i
10
~~~
## expr 命令用法
expr命令一般用于整数值,但也可用于字符串,用来求表达式变量的值,同事expr也是一个手工命令行计数器。
语法:expr expression
~~~
[luo@LNMP-CenOS-6.5 ~]
$ expr 2 + 2 # 运算符两边一定要有空格
4
[luo@LNMP-CenOS-6.5 ~]
$ expr 2 * 2 # 乘以号必须使用反斜线进行转义
expr: 语法错误
[luo@LNMP-CenOS-6.5 ~]
$ expr 2 \* 2
4
~~~
或者 expr $[$a+$b]表达式形式,其中$a$b为整型
~~~
[luo@LNMP-CenOS-6.5 ~]
$ expr $[12+332]
344
[luo@LNMP-CenOS-6.5 ~]
$ expr $[12-332]
-320
[luo@LNMP-CenOS-6.5 ~]
$ expr $[12*332]
3984
~~~
## bc命令支持对浮点数计算(以上其他的都无法计算)
~~~
[luo@LNMP-CenOS-6.5 ~]
$ echo 1+32
1+32
[luo@LNMP-CenOS-6.5 ~]
$ echo 1+32|bc
33
[luo@LNMP-CenOS-6.5 ~]
$ echo 1.2+213.2|bc
214.4
~~~
## $[]用法
~~~
[luo@LNMP-CenOS-6.5 ~]
$ echo $[12+21]
33
~~~