[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
~~~