在 Shell 中所有的变量默认都是"字符串型"。也就是说,如果不手工指定变量的类型,那么所有的数值都是不能进行运算的。比如:
[root@localhost sh]# aa=11 [root@localhost sh]# bb=22 #给变量aa和bb赋值 [root@localhost sh]# cc=$aa+$bb #我想让cc的值是aa和bb的和 [root@localhost sh]# echo $cc 11+22 #但是cc的值却是"11+22"这个字符串,并没有进行数值运算
如果需要进行数值运算,则可以采用以下三种方法中的任意一种:
1.使用declare声明变量类型
既然所有变量的默认类型是字符串型,那么只要把变量声明为整数型不就可以参与运算了吗?使用 declare 命令就可以声明变量的类型。
declare 命令格式如下:
[root@localhost ~]# declare [+/-] [选项] 变量名
选项:
- -:给变量设定类型属性;
- +:取消变量的类型属性;
- -a:将变量声明为数组型;
- -i:将变量声明为整数型(integer);
- -r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性;
- -x:将变量声明为环境变量;
- -p:显示指定变量的被声明的类型;
【例 1】数值运算
只要把变量声明为整数型就可以参与运算了吗?试试吧:
#给变量aa和bb赋值
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22 [root@localhost ~]# declare -i cc=$aa+$bb #声明变量cc的类型是整数型,它的值是aa和bb的和 [root@localhost ~]# echo $cc 33
#这下终于可以相加了
这样运算好麻烦!没有办法,Shell 在数值运算方面确实是比较麻烦的,习惯就好了。
2.使用expr或let数值运算工具
进行数值运算的第二种方法是使用 exp 命令,这个命令就没有 declare 命令那么复杂了。命令如下:
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 #给变量aa和bb赋值 [root@localhost ~]# dd=$(expr $aa + $bb) #dd的值是aa和bb的和。注意"+"号左右两侧必须有空格 [root@localhost ~]# echo $dd 33
在使用 expr 命令进行运算时,要注意"+"号左右两侧必须有空格,否则运算不执行。
至于 let 命令,和 expr 命令基本类似,都是 Linux 中的运算命令。命令如下:
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 #给变量aa和bb赋值 [root@localhost ~]# let ee=$aa+$bb [root@localhost ~]# echo $ee 33 #变量ee的值是aa和bb的和 [root@localhost ~]# n=20 #定义变量n [root@localhost ~]# let n+=1 #变量n的值等于变量本身再加1 [root@localhost ~]# echo $n 21
expr 和 let 命令大家可以按照习惯使用,不过 let 命令对格式的要求要比 exp 命令格式的要求宽松,所以推荐使用 let 命令进行数值运算。
3.使用"$((运算式))"或"$[运算式]"方式运算
其实这是一种方式,"$(())"和"$[]"这两种括号按照个人习惯使用即可。命令如下:
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 [root@localhost ~]# ff=$(( $aa+$bb)) [root@localhost ~]# echo $ff 33 #变量ff的值是aa和bb的和 [root@localhost ~]# gg=$[ $aa+$bb ] [root@localhost ~]# echo $gg 33 #变量gg的值是aa和bb的和
这三种数值运算方式,大家可以按照自己的习惯来选择使用。不过我们推荐使用"$((运算式))",这种方式更加简单,也更加常用。