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