Kevin_306

06-SHELL脚本编程基础-算术运算-条件测试命令 20210401 (四)

 一、算术运算

Shell允许在某些情况下对算术表达式进行求值,比如:let和declare 内置命令,(( ))复合命令和算术扩 展。求值以固定宽度的整数进行,不检查溢出,尽管除以0 被困并标记为错误。运算符及其优先级,关 联性和值与C语言相同。以下运算符列表分组为等优先级运算符级别。级别按降序排列优先。

注意:bash 只支持整数,不支持小数

 乘法符号有些场景中需要转义

实现算术运算:

 (1) let var=算术表达式

(2) ((var=算术表达式)) 和上面等价

(3)  var=$[算术表达式]

(4) var=$((算术表达式))

(5) var=$(expr arg1 arg2 arg3 ...)

(6) declare -i var = 数值

(7) echo '算术表达式' | bc (只有bc支持小数点运算

其他运算方式都不支持小数点运算

举例演示:但是结果运算不是外面想要的结果?怎么办?

   let var=算术表达式

   var=$[算术表达式]

 

 var=$((算术表达式))

 echo '算术表达式' | bc

 expr运算

[root@centos8 ~]# type expr
expr is /usr/bin/expr
[root@centos8 ~]# expr 2 + 5
7
[root@centos8 ~]# expr 2+5
2+5
[root@centos8 ~]# expr 3 + 5
8
[root@centos8 ~]# expr 4 + 5
9
[root@centos8 ~]# expr 4 / 2
2
[root@centos8 ~]# expr 4 / 5
0
[root@centos8 ~]# expr 4 * 5
expr: syntax error: unexpected argument ‘1.txt’
[root@centos8 ~]# expr 4 \* 5
20
[root@centos8 ~]# expr (4 * 5)
-bash: syntax error near unexpected token `4'
[root@centos8 ~]# 

 其他运算方式都不支持小数点运算,所以4/5,结果为0

 重点理解这个题型:

[root@centos8 ~]# i=100
[root@centos8 ~]# 
[root@centos8 ~]# let i++
[root@centos8 ~]# echo $i
101
[root@centos8 ~]# let ++i
[root@centos8 ~]# echo $i
102

[root@centos8 ~]# i=100;let j=i++;echo i=$i,j=$j
i=101,j=100

说明:j=i++,   i在前先用,先把j=i,然后再给i赋值去加+,因为j=i,i的初始值100,i得加1是101,j还是100

[root@centos8 ~]# i=100;let j=++i;echo i=$i,j=$j
i=101,j=101

说明:j=++i,1++;i在后,+在前相当于是先加,i就是100+1,最后赋值给j,j=i=101

 

 j=i++,   i在前先用,先把j=i,然后再给i赋值去加+,因为j=i,i的初始值100,i得加1是101,j还是100

 j=++i,1++;i在后,+在前相当于是先加,i就是100+1,最后赋值给j,j=i=101

---------------------------------

取模

* / %  multiplication, division, remainder, %表示取模,即取余数,示例:9%4=1,5%3=2 

[17:39:34 root@centOS8 ~]#let i=$((10%3));echo $i
1

  范例:

$RANDOM   取值范围:0-32767

  #生成 0 - 49 之间随机数 echo $[$RANDOM%50]

  #生成 0 - 70 之间随机数 echo $[$RANDOM%70+1

二、逻辑运算 

true, false

1  true   0  false

与 &:和0相与,结果为0,和1相与,结果保留原值 , 只有都是真才为真,只要有一个为假,结果就为假

1 与 1 = 1 
1 与 0 = 0 
0 与 1 = 0 
0 与 0 = 0

或 |:和1相或结果为1,和0相或,结果保留原值,只要有一个是真,结果就是真,只有都为假,结果才为假 

1 或 1 = 1 
1 或 0 = 1 
0 或 1 = 1 
0 或 0 = 0

   短路运算:

   1.短路与 &&

   CMD1 短路与 CMD2

   第一个CMD1结果为真 (1),第二个CMD2必须要参与运算,才能得到终的结果

   第一个CMD1结果为假 (0),总的结果必定为0,因此不需要执行CMD2 

   2.短路或 ||

   CMD1  短路或 CMD2

   第一个CMD1结果为真  (1),总的结果必定为1,因此不需要执行CMD2

   第一个CMD1结果为假  (0),第二个CMD2 必须要参与运算,才能得到终的结果

  举例

 

 8 的二进制是1000  

 4 的二进制是0100 

  & 运算,合在一起就是0000,转换成十进制就是0

   | 运算,合在一起是1100,转换成十进制就是12

 三、条件测试命令

    条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成 测试过程 ,实现评估布尔声明,以便用在条件性环境下进行执行  

    若真,则状态码变量 $? 返回0 ;

    若假,则状态码变量 $? 返回1。

条件测试命令:
test EXPRESSION 
[ EXPRESSION ]   #和test 等价,建议使用 [ ]
[[ EXPRESSION ]]   相当于增强版的test, 且支持正则表达式和通配符 
注意:EXPRESSION前后必须有空白字符

  数值测试 

-eq 是否等于 
-ne 是否不等于 
-gt 是否大于 
-ge 是否大于等于 
-lt 是否小于 
-le 是否小于等于

 举例1:

 举例2:

 

 变量如果写错了,或者漏写了会报错,unary operator expected;

 解决办法:变量加引号

[00:12:53 root@centos7-kevin306 ~]#x=mage;y=mage;unset y;[ $x = $y ] && echo 相同 || echo 不相同
-bash: [: mage: unary operator expected
不相同
[00:15:02 root@centos7-kevin306 ~]#[ $x =  ] 
-bash: [: mage: unary operator expected
[00:15:15 root@centos7-kevin306 ~]#x=mage;y=mage;[ "$x" = "$y" ] && echo 相同 || echo 不相同
相同

 

条件测试命令举例

查看ID

[root@rocky8 ~]#grep VERSION_ID /etc/os-release
VERSION_ID="8.4"
[root@rocky8 ~]#grep VERSION_ID /etc/os-release |cut -d'"' -f2 
8.4

[root@rocky8 data]#[ `whoami` = "root" -a -e /data/a.txt ] && rm -f /data/a.txt

1.判断某个文件存在不存在,并且是root的,存在的话满足条件把它删除

 

  2.[[ EXPRESSION ]]   双中括号是一个关键字,相当于增强版的test, 且支持正则表达式和通配符

 举例:=~ 后面跟正则表达式 .*\.sh$

 

[root@rocky8 data]#file=a.sh ;[[ "$file" =~ .*\.sh$ ]] && echo this is a script
this is a script

   == 后面跟通配符 *.sh

  

 [root@rocky8 data]#file=a.sh ;[[ "$file" == *.sh ]] && echo this is a script

this is a script

#centos7

[00:56:42 root@centos7-kevin306 ~]#file=a.sh ; [[ "$file" =~ .*\.sh$ ]] && echo This is a script
This is a script
[00:56:46 root@centos7-kevin306 ~]#
[00:56:47 root@centos7-kevin306 ~]#file=a.txt ; [[ "$file" =~ .*\.sh$ ]] && echo This is a script

 

posted on 2021-04-01 03:52  熊猫小虾  阅读(191)  评论(0编辑  收藏  举报

导航