前面介绍了 bash编程的基础变量与算术表达式 ,本文介绍在脚本中的进阶知识: 测试
在bash中测试大体分两部分: 条件测试、组合测试 。
而条件测试有分: 数值测试 、 字符串测试 、 文件测试 。
组合测试则有两种表达方式。具体是什么表达方式在文章中会有具体展示。
本文实验环境为CentOS7.2
linux中为什么要学习测试(判断)?当我第一次学习这部分内容时,觉得好难,好不爽。可是这又是想要继续学习Linux必须要掌握的知识点。为什么?我们在生活中面对各种选择时总要问问自己,我是否应该怎样,不这样会发生什么,在生活中就有诸多类似的“测试”,工作中也离不开, 而我们学习Linux掌握这门技术是为了更好的工作,Linux的学习自然也离不开“测试”。当然这么说还有些抽象,那么就举个具体的例子:接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”。
如果你没有学过测试那么此时别人让你写这么一个脚本供他使用,你怎么办?
在正式介绍测试前,我们需要先介绍下在测试中必备的数学知识: 逻辑运算
逻辑运算 :
逻辑运算在希腊时期就已经出现,不过它正式被运用于数字电路及计算机则是20世纪的一个人物: 香农 。 他 在其硕士论文中提出将布尔代数应用于电子领域的概念,并给出能够构建任何逻辑和数值关系的逻辑电路的解决方法。有了香农的贡献才有了如今的计算机。
逻辑运算主要包括三种: 与或非 ,之后在这三种基础上又出现了异或(这里不再介绍)。
在Linux中与或非的运算符号为:
与 : && 在测试命令中有时也会用-a表示与
或 : || 在测试命令中有时也会用-o表示或
非 : !
与、或、非运算:
与运算 : 1 && 1 = 1 1 && 0 = 0
或运算 : 1 || 1 = 1 1 || 0 = 1 0 || 1 = 1 0 || 0 = 0
非运算 : ! 1 = 0 ! 0 = 1
在计算机中由于用1表示真,0表示假,故上面的三种运算也可以看做如下概念:
与运算 : 真 && 真 = 真 真 && 假 = 假
或运算 : 真 || 真 = 真 真 || 假 = 真 假 || 真 = 真 假 || 假 = 假
非运算 : ! 真 = 假 ! 假 = 真
在测试中常用的逻辑运算中的定律
德摩根定律 :
非(P 且 Q)=(非 P)或(非 Q) 非(P 或 Q)=(非 P)且(非 Q)它在测试中的作用:通常为了化 简逻辑表达式 。
比如在一个测试表达式中出现了多个-a或-o使用德摩根定律可以减少其个数
! a == b -a ! c == d -a ! d == a 等价于!( a == b -o c == d -o d == a )
当前面-not或!很多时可以使用这种表示方式,这两种是 等价的
测试表达式 :
测试表达式分三种:
1、 test EXPRESSION
2、 [ EXPRESSION ] 3、 [[ EXPRESSION ]]上面三种使用各有其适用范围,限于所学有限没有能力对其进行一一归纳,我觉得刚开始学不需要求全责备,先掌握大体知识框架比较好。之后在实际中遇到再慢慢进行总结。脚本写的多,遇到的问题多,这三种的使用场景自然就心领神会了。
条件测试 : 数值测试 、 字符串传测试 、 文件测试
数值测试 :判断两个数值的大小及是否相等,有如下
-gt :是否大于 大于为真,否则为假
-ge :是否大于等于 大于等于为真,否则为假
-eq :是否等于 等于为真,否则为假
-ne :是否不等于 不等于为真,否则为假
-lt :是否小于 小于为真,否则为假
-le :是否小于等于 小于等于为真,否则为假
下面是一个小例子显示其简单用法, $? 是 执行状态返回值 ,可以查看上一条命令执行结果的真与假, 0表示为真 , 1-255为假 。
[root@localhosttest]#[1-eq2] [root@localhosttest]#echo$? 1我们判断1是否等于2,状态返回值为1判断执行结果为假,所以1不等于2.
………………………………………………………………………………………………………………………
字符串测试 :判断字符串是否符合或等于给定的字符串
字符串的判断大小是依据 ASCII中字符对应的数字大小进行
== :是否等于 等于为真,否则为假
> :是否大于 大于为真,否则为假
< :是否小于 小于为真,否则为假
!= :是否不等于 不等于为真,否则为假
=~ :左侧字符串是否能够被右侧的PATTERN(正则表达式)所匹配 若匹配则为真,否则为假
-z “string” : 测试字符串是否为空,空则为真,否则为假
-n “string” :测试字符串是否不为空,不空为真,否则为假
下面也举一个简单的例子展示 字符串测试 用法
[root@localhosttest]#[a==b] [root@localhosttest]#echo$? 1 [root@localhosttest]#[a<b] -bash:b:没有那个文件或目录 [root@localhosttest]#["a"<"b"] -bash:b:没有那个文件或目录 [root@localhosttest]#[["a"<"b"]] [root@localhosttest]#echo$? 0 这里我先对ab是否相等进行判断,之后查看结果是假,也就是a不是b。之后对其进行大小判断,然后报错,先为ab加""结果报错,之后又加了[]才未报错。这里我们可以看到在字符串测试中使用[[ ]]方式进行会比较靠谱,但也不一定。用[]还是[[ ]]就是在这种测试中摸索出来的。下面再对 字符是否为空 举一个例子
[root@localhosttest]#name1= [root@localhosttest]#[-z$name1] [root@localhosttest]#echo$? 0 [root@localhosttest]#[-n$name1] [root@localhosttest]#echo$? 0怎么会出现这种情况?字符测试为空竟然不灵!别慌,上面我们曾有经验,字符测试如果单中括号失败那就试试双中括号
[root@localhosttest]#[[-z$name1]] [root@localhosttest]#echo$? 0 [root@localhosttest]#[[-n$name1]] [root@localhosttest]#echo$? 1结果终于如愿,上面的两个例子告诉我们,当测试结果并不是对时, 调整下中括号 往往有奇效。
………………………………………………………………………………………………………………………
文件测试 :
1、 存在性测试
-a FILE (少用)
-e FILE 文件存在性测试,存在为真,否则为假
[root@localhosttest]#[-e/etc/fstab] [root@localhosttest]#echo$? 0 [root@localhosttest]#[[-e/etc/ftab]] [root@localhosttest]#echo$? 12、 存在性及类别测试
-b FILE:是否存在且为块设备文件,存在为真否则为假
-c FILE:是否存在且为字符设备文件,存在为真,否则为假
-f FILE:是否存在且为普通文件,存在为真,否则为假
-d FILE:是否存在且为目录文件,存在为真,否则为假
-h FILE 或 -L FILE :是否存在且为链接文件,存在为真,否则为假
-p FILE:是否存在且为命名管道文件,存在为真,否则为假
-S FILE:是否存在且为套接字文件,存在为真,否则为假
[root@localhosttest]#[-f/test/if1] [root@localhosttest]#echo$? 0 [root@localhosttest]#[-f/test/] [root@localhosttest]#echo$? 1