在Linux的shell中,变量的值的类型默认是字符串,不能直接进行数值运算。
[root@localhost ~]# aa=11
[root@localhost ~]# b=22
[root@localhost ~]# c=$aa+$bb
[root@localhost ~]# echo $cc
11+22
要想对变量进行数值运算,需要采用特殊的方法。
1. declare声明变量类型
[root@localhost ~]# declare [+/-] [选项] 变量名
选项:
- 给变量设定类型属性。
+ 取消变量的类型属性。
-i 将变量声明为整型(integer)。
-x 将变量声明为环境变量。
-p 查看变量被声明的类型。
方法1:declare声明变量类型
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
[root@localhost ~]# echo $cc
33
方法2:expr或let数值运算工具
注意:expr后面要有空格。
示例:
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# dd=$(expr $aa + $bb)
#注意"+"号左右两侧必须有空格
[root@localhost ~]# echo $dd
33
$()的作用是优先执行括号内的命令,并将命令的执行结果保存在内存中(而不是直接输出)。
方法3.
((运算式))或
[表达式]
说明:括号内部两侧可以有空格,也可省略空格。
((表达式))和[表达式] 的作用相同。
示例:
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa + $bb ))
[root@localhost ~]# echo $ff
33
[root@localhost ~]# gg=$[ $aa + $bb ]
说明:+号左右两侧的空格也可省略。
总结:推荐使用第三种方法,因为它更加方便和灵活。
4. 运算符
Linux中的运算符主要有单目运算符和双目运算符,运算符也有优先级的高低之分。
运算符主要有以下这些:
优先级 | 运算符 | 类型 | 说明 |
---|---|---|---|
13 | +、- | 单目 | 单目正、单目负。它们是单目运算符的正、负,而不是加、减。 |
12 | !、~ | 单目 | 逻辑非、按位取反或补码。 |
11 | *、/、% | 双目 | 乘、除、取模。 |
10 | +、- | 双目 | 加、减。 |
9 | <<、>> | 双目 | 按位左移、按位右移。 |
8 | <、<=、>、>= | 双目 | 小于、小于等于、大于、大于等于。 |
7 | ==、!= | 双目 | 等于、不等于。 |
6 | & | 双目 | 按位与。 |
5 | ^ | 双目 | 按位异或。 |
4 | | | 双目 | 按位或。 |
3 | && | 双目 | 逻辑与。 |
2 | || | 双目 | 逻辑或。 |
1 | =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= | 双目 | 赋值、运算且赋值。 |
说明:对于该表,数值越大,优先级越高。故赋值运算符的优先级最低。
注意: 小括号内的表达式的优先级最高,会优先运算。因此,可以用小括号改变运算符的优先级。
优先级越高,会先进行运算;相同优先级的运算符,按照先后顺序顺序运算。
示例:
[root@localhost ~]# echo $(( (3+5)*6 ))
48
[root@localhost ~]# echo $(( 14%3 ))
2
[root@localhost ~]# echo $[ 1&&1 ]
1
[root@localhost ~]# echo $[ 1&&0 ]
0
[root@localhost ~]# echo $[ 0||0 ]
0
[root@localhost ~]# echo $[ ab || a2 ]
0
[root@localhost ~]# echo $[ 0||null ]
0
[root@localhost ~]# echo $[ 1||0 ]
1
[root@localhost ~]# echo $[ a||b ]
1
说明:
对于逻辑与(&&)运算,只有当两侧的值都为非0时,整个表达式的值才为1。
对于逻辑或(||)运算,只有当两侧的值都为0时,整个表达式的值才为0。