|NO.Z.00051|——————————|LinuxShell|——|Linux&Shell$变量.V08|——|数值运算符|
一、数值运算的方法
### --- declare选项说明
~~~ 那如果我需要进行数值运算,可以采用以下三种方法中的任意一种:
~~~ 使用 declare 声明变量类型
~~~ 既然所有变量的默认类型是字符串型,那么只要我们把变量声明为整数型不就可以运算了吗?
~~~ 使用 declare 命令就可以实现声明变量的类型。命令如下:
~~~ # 选项:
~~~ -:给变量设定类型属性
~~~ +:取消变量的类型属性
~~~ -a:将变量声明为数组型
~~~ -i:将变量声明为整数型(integer)
~~~ -r:讲变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过+r 取消只读属性
~~~ -x:将变量声明为环境变量
~~~ -p:显示指定变量的被声明的类型
[root@localhost ~]# declare [+/-][选项] 变量名
二、数值运算实验
### --- 例子 1:数值运算
~~~ 那我们只要把变量声明为整数型不就可以运算了吗?试试吧:
~~~ 给变量 aa 和 bb 赋值
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
~~~ 声明变量 cc 的类型是整数型,它的值是 aa 和 bb 的和
[root@localhost ~]# declare -i cc=$aa+$bb
~~~ 这下终于可以相加了
~~~ 样运算好麻烦啊,没有办法啊,Shell 在数值运算这里确实是比较麻烦,习惯就好了-_-!。
[root@localhost ~]# echo $cc
33
### --- 例子 2:数组变量类型
~~~ 数组这个东东只有写一些较为复杂的程序才会用到,大家可以先不用着急学习数组,
~~~ 当有需要的时候再回来详细学习。那么数组是什么呢?
~~~ 所谓数组,就是相同数据类型的元素按一定顺序排列的集合,
~~~ 就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,
~~~ 这个名字称为数组名,编号称为下标。组成数组的各个变量成为数组的分量,
~~~ 也称为数组的元素,有时也称为下标变量。
~~~ 一看定义就一头雾水,更加不明白数组是什么了。
~~~ 那么换个说法,变量和数组都是用来保存数据的,只是变量只能赋予一个数据值,
~~~ 一旦重复复制,后一个值就会覆盖前一个值。
~~~ 而数组是可以赋予一组相同类型的数据值。
~~~ 大家可以把变量想象成一个小办公室,这个办公室只能容纳一个人办公,办公室名就是变量名。
~~~ 而数组是一个大办公室,可以容纳很多人同时办公,
~~~ 在这个大办公室办公的每个人是通过不同的座位号来区分的,
~~~ 这个座位号就是数组的下标,而大办公室的名字就是数组名。
~~~ # 还是举个例子吧:
~~~ 数组中第一个变量是沈超(大办公室第一个办公桌坐最高大威猛帅气的人)
[root@localhost ~]# name[0]="shen chao"
~~~ 数组第二个变量是李明(大办公室第二个办公桌坐头发锃亮的人)
[root@localhost ~]# name[1]="li ming"
~~~ 数组第三个变量是佟刚(大办公室第三个办公桌坐眼睛比超哥还小的老师)
[root@localhost ~]# name[2]="tong gang"
~~~ 输出数组的内容,如果只写数组名,那么只会输出第一个下标变量
[root@localhost ~]# echo ${name}
shen chao
~~~ # 输出数组所有的内容
~~~ 注意数组的下标是从 0 开始的,在调用数组值时,需要使用${数组[下标]}的方式来读取。
~~~ 不过好像在刚刚的例子中,我们并没有把 name 变量声明为数组型啊,
~~~ 其实只要我们在定义变量时采用了“变量名[下标]”的格式,
~~~ 这个变量就会被系统认为是数组型了,不用强制声明。
[root@localhost ~]# echo ${name[*]}
shen chao li ming tong gang
### --- 例子 3: 环境变量
~~~ 我们其实也可以使用 declare 命令把变量声明为环境变量,和 export 命令的作用是一样的:
~~~ 把变量 test 声明为环境变量
[root@localhost ~]# declare -x test=123
### --- 例子 4:只读属性
~~~ 注意一旦给变量设定了只读属性,那么这个变量既不能修改变量的值,
~~~ 也不能删除变量,甚至不能使用“+r”选项取消只读属性。命令如下:
~~~ 给 test 赋予只读属性
[root@localhost ~]# declare -r test
~~~ test 变量的值就不能修改了
[root@localhost ~]# test=456
-bash: test: readonly variable
~~~ 也不能取消只读属性
[root@localhost ~]# declare +r test
-bash: declare: test: readonly variable
~~~ 也不能删除变量
~~~ 不过还好这个变量只是命令行声明的,所以只要重新登录或重启,这个变量就会消失了。
[root@localhost ~]# unset test
-bash: unset: test: cannot unset: readonly variable
### --- 例子 5:查询变量属性和取消变量属性
~~~ 变量属性的查询使用“-p”选项,变量属性的取消使用“+”选项。命令如下:
~~~ cc 变量是 int 型
[root@localhost ~]# declare -p cc
declare -i cc="33"
~~~ name 变量是数组型
[root@localhost ~]# declare -p name
declare -a name='([0]="shen chao" [1]="li ming" [2]="tong gang")'
~~~ test 变量是环境变量和只读变量
[root@localhost ~]# declare -p test
declare -rx test="123"
~~~ 取消 test 变量的环境变量属性
[root@localhost ~]# declare +x test
~~~ 注意,只读变量属性是不能取消的使用 expr 或 let 数值运算工具
[root@localhost ~]# declare -p test
declare -r test="123"
~~~ # 要想进行数值运算的第二种方法是使用 expr 命令,这种命令就没有 declare 命令复杂了。
~~~ 命令如下:给变量 aa 和变量 bb 赋值
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
~~~ dd 的值是 aa 和 bb 的和。注意“+”号左右两侧必须有空格
[root@localhost ~]# dd=$(expr $aa + $bb)
~~~ 使用 expr 命令进行运算时,要注意“+”号左右两侧必须有空格,否则运算不执行。
[root@localhost ~]# echo $dd
33
~~~ # 至于 let 命令和 expr 命令基本类似,都是 Linux 中的运算命令,命令格式如下:
~~~ 给变量 aa 和变量 bb 赋值
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
~~~ 变量 ee 的值是 aa 和 bb 的和
[root@localhost ~]# let ee=$aa+$bb
[root@localhost ~]# echo $ee
33
~~~ 定义变量 n
[root@localhost ~]# n=20
~~~ 变量 n 的值等于变量本身再加 1
[root@localhost ~]# let n+=1
~~~ # expr 命令和 let 命令大家可以按照习惯使用,不过 let 命令对格式要求要比 expr 命令宽松,
~~~ 所以推荐使用 let 命令进行数值运算。
~~~ 使用“$((运算式))”或“$[运算式]”方式运算
[root@localhost ~]# echo $n
21
~~~ # 其实这是一种方式“$(())”和“$[]”这两种括号按照个人习惯使用即可。
~~~ 命令如下:变量 ff 的值是 aa 和 bb 的和
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# echo $ff
33
~~~ 变量 gg 的值是 aa 和 bb 的和
[root@localhost ~]# gg=$[ $aa+$bb ]
[root@localhost ~]# echo $gg
33
### --- 这三种数值运算方式,大家可以按照自己的习惯来进行使用。
~~~ 不过我们推荐使用“$((运算式))”的方式
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv008-shell
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」