linux运算_Shell数值运算方法(3种)

Shell 编程和其他语言还是有很多不一样的地方的,其中笔者最不习惯的是:在 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"这个字符串,并没有进行数值运算

如果需要进行数值运算,则可以采用以下三种方法中的任意一种。

使用declare声明变量类型

既然所有变量的默认类型是字符串型,那么只要把变量声明为整数型不就可以参与运算了吗?使用 declare 命令就可以声明变量的类型。

declare 命令格式如下:

[root@localhost ~]# declare [+/-] [选项] 变量名

选项:

-:给变量设定类型属性;

+:取消变量的类型属性;

-a:将变量声明为数组型;

-i:将变量声明为整数型(integer);

-r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性;

-x:将变量声明为环境变量;

-p:显示指定变量的被声明的类型;

【例 1】数值运算

只要把变量声明为整数型就可以参与运算了吗?试试吧:

[root@localhost ~]# aa=11

[root@localhost ~]# bb=22

#给变量aa和bb赋值

[root@localhost ~]# declare -i cc=$aa+$bb #声明变量cc的类型是整数型,它的值是aa和bb的和

[root@localhost ~]# echo $cc

33

#这下终于可以相加了

这样运算好麻烦!没有办法,Shell 在数值运算方面确实是比较麻烦的,习惯就好了。

【例 2】数组变量类型

数组是什么呢?所谓数组,就是相同数据类型的元素按一定顺序排列的集合,也就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量的集合,我们把这个名字称为数组名,把编号称为下标。组成数组的各个变量被称为数组的分量,又称数组的元素,下标变量。

一看定义就一头雾水,更加不明白数组是什么了。那么换一种说法,变量和数组都是用来保存数据的,只是变量只能被赋予一个数据值,一旦重复赋值,后一个值就会覆盖前一个值;而数组可以被赋予一组相同类型的数据值。

大家可以把变量想象成一间小办公室,这间办公室里只能容纳一个人办公,办公室名就是变量名;而数组是一间大办公室,可以容纳很多人同时办公,在这间大办公室里办公的每个人是通过不同的座位号来区分的,这个座位号就是数组的下标,而大办公室的名字就是数组名。

还是举个例子吧:

[root@localhost ~]# name[0]="zhang san"

#数组中第一个变量是张三

[root@localhost ~]# name[1]="li ming"

#数组中第二个变量是李明

[root@localhost ~]# name[2]="gao luo feng"

#数组中第三个变量是高洛峰

[root@localhost ~]# echo ${name}

zhang san

#输出数组的内容。如果只写数组名,那么只会输出第一个下标变量

[root@localhost ~]# echo ${name[*]}

zhang san li ming gao luo feng

#输出数组所有的内容

注意,数组的下标是从 0 开始的,在调用数组的元素时,需要使用"${数组[下标]}"方式来读取。

不过,在刚刚的例子中,我们并没有把 name 变量声明为数组型。其实只要我们在定义变量时采用了"变量名 [下标]"的格式,这个变量就会被系统认为是数组型了,不用强制声明。

【例 3】环境变量

其实也可以使用 declare 命令把变量声明为环境变量,它和 export 命令的作用是一样的。命令如下:

[root@localhost ~]# declare -x test=123

#把变量test声明为环境变量

【例 4】只读属性

一旦给变量设定了只读属性,那么这个变量既不能修改变量的值,也不能删除变量,甚至不能使用"+r"选项取消只读属性。命令如下:

[root@localhost ~]# declare -r test

#给test变量赋予只读属性

[root@localhost ~]#test=456

-bash:test: readonly variable

#test变量的值就不能修改了

[root@localhost ~]# declare +r test

-bash:declare:test:readonly variable

#也不能取消只读属性

[root@localhost ~]# unset test

-bash: unset: test: cannot unset: readonly variable

#也不能删除变量

不过,还好这个变量只是命令行声明的,所以只要重新登陆或重启,这个变量就会消失了。

【例 5】查询变量属性和取消变量属性

变量属性的查询使用"-p"选项,变量属性的取消使用"+"选项。命令如下:

[root@localhost ~]# declare -p cc

declare -i cc="33"

#cc变量是int型

[root@localhost ~]# declare -p name

declare -a name='([0]="zhang san" [1]="li ming" [2]="gao luo feng")'

#name变量是数组型

[root@localhost ~]# declare -p test

declare -rx test="123"

#test变量是环境变量和只读变量

[root@localhost ~]# declare +x test

#取消test变量的环境变量属性

[root@localhost ~]# declare -p test

declare-rtest="123"

#注意:只读变量属性是不能被取消的

使用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 命令进行数值运算。

使用"$((运算式))"或"$[运算式]"方式运算

其实这是一种方式,"$(())"和"$[]"这两种括号按照个人习惯使用即可。命令如下:

[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的和

这三种数值运算方式,大家可以按照自己的习惯来选择使用。不过我们推荐使用"$((运算式))",这种方式更加简单,也更加常用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值