敖汉每集博客word...吧 关注:9贴子:63
  • 0回复贴,共1

shell基础bash数值运算符-60

只看楼主收藏回复

shell基础bash数值运算符
一、数值运算
没开始之前我们来看一个案例:
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# c=$a+$b
[root@localhost ~]# echo $c
大家说这样最后会输出什么值?是3,还是??
看图吧:

大家可能会奇怪,正常应该是输出a和b的和才对,为什么把算式原封不动的输出了呢?
其实我们在前面讲过,在linux里所有变量的值默认都会被认为是字符串型的。也就是说这里把1和2都认为成是字符串分别赋值给a和b了,然后变量a和b的值相加最后赋值给变量c输出了,而变量c也认为他的值是字符串,所以就不会进行运算。
好,那么我们就开始学习linux里的数值运算的方式。
1、declare声明变量类型
[root@localhost ~]# declare [+/-][选项]变量名
选项:
-:给变量设定类型属性
+:取消变量的类型属性
-i:将变量声明为整数型(integer)
-x:将变量声明为环境变量
-p:显示指定变量的被声明的类型
好的,我们举几个例子:
A、上面我们把1赋值给了变量a,我们用declare -p来查询一下这个变量的类型。
[root@localhost ~]# declare -p a
如图:

看,什么类型都没有,但系统会默认它为字符串型。
好,那我们用前面学习环境变量的时候的export修改变量为环境变量的命令。
我们把变量a变成环境变量。
[root@localhost ~]# export a
然后我们在用declare来查询变量a的类型。
如图:

看,多了一个-x,也就是让变量a具备了-x属性,也就是环境变量属性。
那么也就是说我们前面学习export命令就是给变量设置了-x属性而已,所以我们在这里用declare -x同样能够做到把变量变成环境变量。
[root@localhost ~]# declare -x b
这样就把变量b也声明成环境变量了,如图:

不过我们可能更习惯用export,但其实用哪个都很方便,而且可能用declare -x会更直观一些,用哪个方法,我们自己看习惯了就。
B、那我们再来看另外一个例子。
[root@localhost ~]# declare -i c
也就是把变量c变成数值型的字符串。
[root@localhost ~]# declare +x a
也就是把变量a的环境变量类型去掉
如图:

大家自己尝试,特别的简单。只要记住和正常的逻辑相反,+是取消属性,-号是增加属性。
2、数值运算方法1
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# declare -i c=$a+$b
也就是说我们给c变量直接设置为数值型变量,这样一来结果就不是字符串型了,而是变成数值型,也就是说输出变量a和变量b的和了。如图:

3、数值运算方法2
用expr或let数值运算工具
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# d=$(expr $a + $b)
注意加号左右两侧的空格必须有,不然会报错。
如图:

这里只介绍expr,就不介绍let了,因为平时这种方法很少用,所以不多介绍。
4、数值运算方法3
$((运算式))或$[运算式]
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# e=$(($a + $b))
[root@localhost ~]# f=$[$a + $b]
这两种方法是我们最常用的,也是比较符合逻辑的,大家用心学习一下就好。
而这里的加号左右有没有空格是都可以的。
推荐大家用双小括号的方法。
如图:

二、运算符
1、在linux里运算符也同样是有优先级的高低的,只不过是优先级越高序号越高,和日常生活中不一样,日常生活中优先级越高那么序号越小,比如第一第二…
而这里正好相反,优先级越高,序号也就越大。
我们来看下面这些运算符优先级的表格:
#############################################
优先级||运算符||说明
13 || -,+ ||单目负、单目正
12 || !,~ ||逻辑非、按位取反或补码
11 ||*,/,% ||乘、除、取模
10 || +,- ||加、减
9 ||<<,>> ||按位左移、按位右移
8 ||<=,>=,<,>||小于等于、大于等于、小于、大于
7 ||==,!= ||等于、不等于
6 || & ||按位与
5 || ^ ||按位异或
4 || | ||按位或
3 || && ||逻辑与
2 || || ||逻辑或
1 ||=,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= ||赋值、运算且赋值
==========================================================
2、我们举例说明,这里只讲最常见的加减乘除和逻辑与或。
[root@localhost ~]# a=$(( (11+3)*3/2))
也就是在$(())里面就是数学运算,你怎么算都行,和日常算术是一样的,比如有括号的优先级最高,乘除比加减优先级高。同级别先后顺序运算。
我们其实只要记住$()括号内是一个命令的结果,是字符串型。
而$(( ))双括号里面的就是数值运算的结果,是数值型。
运算的结果如图:

大家可以自己用笔算一下是不是结果是对的,呵呵。
[root@localhost ~]# bb=$((14%3))
注意这里不是两个数相除,而是相除后取模。
什么是取模呢?就是两个数相处后的余数,而不是除完的商。
14除以3得到商4余2,那么模就是2.
[root@localhost ~]# cc=$(( 1 $$ 0))
这个运算是逻辑与运算。
逻辑与运算利用二进制的1或0作为真或假来进行逻辑运算,1为真,0为假。
必须两个数都是1也就是真,最后才会输出为真,也就是1.
只要有一个为0也就是假,那么输出的肯定是假,也就是0.
如图:

看,是不是只有有一个是0那结果肯定是0.
sorry,我中间把&&逻辑与写成$$查看进程PID的预定义变量了。
那么我们再看看逻辑或
[root@localhost ~]# dd=$(( 1||0 ))
[root@localhost ~]# dd=$(( 0||0 ))
逻辑或运算就是只有当两个数都为假,也就是都是0的时候,结果才是0,只有有一面是1,那结果就是1,如图:

逻辑运算在我们的编程当中会经常遇到,大家一定要理解透彻。
本教程原创作者:mageo,出自每集博客,尊重作者劳动,转载请注明出处:ql2015.cn,谢谢!


IP属地:内蒙古1楼2016-01-26 16:03回复