Shell中常用运算符如下表:
优先级数值越大优先级越高,具有较高优先级级别的运算符先于较低级别的运算符进行求值运算。
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 13 | -,+ | 单目负、单目正 |
| 12 | !,~ | 逻辑非、按位取反或补码 |
| 11 | *,/,% | 乘、除、取模 |
| 10 | +,- | 加、减 |
| 9 | <<,>> | 按位左移、按位右移 |
| 8 | <=,>=,<,> | 小于或等于、大于或等于、小于、大于 |
| 7 | ==,!= | 等于、不等于 |
| 6 | & | 按位与 |
| 5 | ^ | 按位异或 |
| 4 | ` | ` |
| 3 | && | 逻辑与 |
| 2 | ` | |
| 1 | =,+=,-=,/=`%=,&=,^=, | =<br /><<=,>>=` |
简单示例:
# 例1:加减乘除# 虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级。[root@Lyl ~]# num=$(( (10+8)*6/2 ))[root@Lyl ~]# echo $num54# 例2:取模运算[root@Lyl ~]# num=$(( 19%5 ))[root@Lyl ~]# echo $num4# 例3:逻辑与# 逻辑与运算只有相与的两边都是1,与的结果才是1,否则与的结果是0[root@Lyl ~]# value=$(( 1&&0 ))[root@Lyl ~]# echo $value0在Shell中所有变量的默认类型是字符串型,那如果我需要进行数值运算,可以采用以下三种方法中的任意一种:
就是使用declare命令,把一个变量声明成数值类型。
# 给变量aa和bb赋值[root@Lyl tmp]# aa=11[root@Lyl tmp]# bb=22# 声明变量cc的类型是整数型,它的值是aa和bb的和。# 这里注意一下,其实应该把变量aa和bb也通过declare命令声明成数值型,# 但是Shell这点还好,只把最后的和cc声明成数值型,也是能进行计算的。[root@Lyl tmp]# declare -i cc=$aa+$bb# 输出变量cc[root@Lyl tmp]# echo $cc33该种方式并不太建议使用,编写有些麻烦。虽然系统最终换算的方式还是用declare命令,但还是不推荐。
使用expr或let数值运算工具,不推荐。
要想进行数值运算的第二种方法是使用expr命令,这种命令就没有declare命令复杂了。
expr运算工具示例如下:
# 给变量aa和bb赋值[root@Lyl ~]# aa=11[root@Lyl ~]# bb=22# aa和bb的求和。# 注意“+”号左右两侧必须有空格。[root@Lyl ~]# cc=$(expr $aa + $bb)# 说明一下# 我们之前说过$( )中调用的是系统命令,# 换句话说$( )中`expr $aa + $bb `是一条运算命令。# 输出cc变量的值[root@Lyl ~]# echo $cc33# 使用expr命令进行运算时,要注意元算符号左右两侧必须有空格,# 否则会报错,元算不能被执行。[root@Lyl ~]# cc=$(expr $aa +$bb)expr: 语法错误let命令和expr命令基本类似,都是Linux中的运算命令。
let元算工具示例如下:
# 示例1# 给变量aa和bb赋值[root@Lyl ~]# aa=11[root@Lyl ~]# bb=22# aa和bb的求和。[root@Lyl ~]# let cc=$aa+$bb[root@Lyl ~]# echo $cc33# 示例2# 定义变量n[root@Lyl ~]# n=10# 变量n的值等于变量本身再加1[root@Lyl ~]# let n+=1[root@Lyl ~]# echo $n11总结:
expr命令和let命令大家可以按照习惯使用,不过let命令对格式要求要比expr命令宽松,所以推荐使用let命令进行数值运算。
使用$((运算符))或者$[运算符]的方式进行运算。(两种都可以)
# 给变量aa和bb赋值[root@Lyl tmp]# aa=11[root@Lyl tmp]# bb=22# 求和[root@Lyl ~]# cc=$(( $aa+$bb))[root@Lyl ~]# echo $cc33总结:
$( )中存放的是系统命令,$(( ))中是进行数学运算的。
$[ ]不推荐使用,因为[ ]在Shell中有极其特殊且重要的作用,就是测试。(之后Shell编程的部分说明)
这三种数值运算方式,大家可以按照自己的习惯来进行使用,推荐使用方式三。