其他分享
首页 > 其他分享> > 条件测试操作

条件测试操作

作者:互联网

条件测试操作

问题

本案例要求参考PPT上的示例,分别练习以下条件测试操作:
识别文件/目录的状态
比较整数值的大小
字符串匹配
多个条件/操作的逻辑组合

步骤

实现此案例需要按照如下步骤进行。
步骤一:条件测试的基本用法
1)一般用法
使用“test 表达式”或者[ 表达式 ]都可以,表达式两边至少要留一个空格。比如,判断变量X的值是否大于5,操作如下:

[root@svr5 ~]# X=10
[root@svr5 ~]# test $X -gt 5

上述test测试也可改用 [ ]方式(推荐用这种方式):

[root@svr5 ~]# [ $X -gt 5 ]
[root@svr5 ~]#

条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即 ??),所以可以在测试后查看变量?),所以可以在测试后查看变量?的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作) 。
比如,分别测试变量X的值(10)是否大于5、是否大于20:

[root@svr5 ~]# [ $X -gt 5 ] 
[root@svr5 ~]# echo $?
0  									//返回值为0,说明测试的条件成立
[root@svr5 ~]# [ $X -gt 20 ]
[root@svr5 ~]# echo $?
1  									//返回值不为0,说明测试的条件不成立

或者,结合逻辑分隔更直接的给出结果:

[root@svr5 ~]# [ $X -gt 5 ] && echo "YES" || echo "NO"
YES  									//因为10>5,所以 YES
[root@svr5 ~]# [ $X -gt 20 ] && echo "YES" || echo "NO"
NO  										//因为 10<20,所以 NO

2)扩展用法
test本身是一个命令,所以往宽了理解,任何命令都可以用作测试,因为在Shell环境中每个命令执行完后都会有返回状态$?。比如,若要检查一个软件包是否安装,正常可以执行“rpm -q 软件名”查询,人工可以直接看显示结果,脚本却没有那么智能,怎么办呢,就看返回值 ??。 比如,分别查询一个已安装的包、未安装的包,?。比如,分别查询一个已安装的包、未安装的包,? 返回值是不同的:

[root@svr5 ~]# rpm -q httpd
httpd-2.2.3-74.el5
[root@svr5 ~]# echo $?
0
[root@svr5 ~]# rpm -q nginx
package nginx is not installed
[root@svr5 ~]# echo $?
1

转化为测试操作,结合逻辑分隔提示结果:

[root@svr5 ~]# rpm -q httpd &> /dev/null && echo "已安装" || echo "未安装"
已安装
[root@svr5 ~]# rpm -q nginx &> /dev/null && echo "已安装" || echo "未安装"

未安装
步骤二:识别文件/目录的状态
1)-e 判断对象是否存在(不管是目录还是文件)

[root@svr5 ~]# [ -e "/usr/src/" ] && echo "存在" || echo "不存在"
存在
[root@svr5 ~]# [ -e "/etc/fstab" ] && echo "存在" || echo "不存在"
存在
[root@svr5 ~]# [ -e "/home/nooby" ] && echo "存在" || echo "不存在"
不存在

2)-d 判断对象是否为目录(存在且是目录)

[root@svr5 ~]# [ -d "/usr/src/" ] && echo "是目录" || echo "不是目录"
是目录
[root@svr5 ~]# [ -d "/etc/fstab" ] && echo "是目录" || echo "不是目录"
不是目录
[root@svr5 ~]# [ -d "/home/nooby" ] && echo "是目录" || echo "不是目录"
不是目录

3)-f 判断对象是否为文件(存在且是文件)

[root@svr5 ~]# [ -f "/usr/src/" ] && echo "是文件" || echo "不是文件"
不是文件
[root@svr5 ~]# [ -f "/etc/fstab" ] && echo "是文件" || echo "不是文件"
是文件
[root@svr5 ~]# [ -f "/home/nooby" ] && echo "是文件" || echo "不是文件"
不是文件

4)-r 判断对象是否可读
此测试对root用户无效,无论文件是否设置r权限,root都可读:

[root@svr5 ~]# cp install.log /tmp/rtest.txt  	//复制一个文件做测试
[root@svr5 ~]# chmod -r /tmp/rtest.txt  		//去掉所有的r权限
[root@svr5 ~]# ls -ld /tmp/rtest.txt  			//确认设置结果
--w------- 1 root root 33139 12-11 10:43 /tmp/rtest.txt 
[root@svr5 ~]# [ -r "/tmp/rtest.txt" ] && echo "可读" || echo "不可读"
可读  											//root测试结果仍然可读

切换为普通用户,再执行相同的测试,结果变为“不可读”:

[zengye@svr5 ~]$ [ -r "/tmp/rtest.txt" ] && echo "可读" || echo "不可读"
不可读

普通用户只对自己拥有r权限的文件或目录,-r测试时结果才成立:

[zengye@svr5 ~]$ ls -l .bashrc
-rw-r--r-- 1 zengye zengye 124 09-24 16:44 .bashrc
[zengye@svr5 ~]$ [ -r ".bashrc" ] && echo "可读" || echo "不可读"
可读

5)-w 判断对象是否可写
此测试同样对root用户无效,无论文件是否设置w权限,root都可写:

[root@svr5 ~]# chmod -w /tmp/rtest.txt 			//去掉所有的w权限
[root@svr5 ~]# ls -l /tmp/rtest.txt  			//确认设置结果
---------- 1 root root 33139 12-11 10:43 /tmp/rtest.txt
[root@svr5 ~]# [ -w "/tmp/rtest.txt" ] && echo "可写" || echo "不可写"
可写

切换为普通用户,可以正常使用-w测试:

[zengye@svr5 ~]$ ls -l /tmp/rtest.txt
---------- 1 root root 33139 12-11 10:52 /tmp/rtest.txt
[zengye@svr5 ~]$ [ -w "/tmp/rtest.txt" ] && echo "可写" || echo "不可写"
不可写
[zengye@svr5 ~]$ ls -l .bashrc
-rw-r--r-- 1 zengye zengye 124 09-24 16:44 .bashrc
[zengye@svr5 ~]$ [ -w ".bashrc" ] && echo "可写" || echo "不可写"
可写

6)-x 判断对象是否具有可执行权限
这个取决于文件本身、文件系统级的控制,root或普通用户都适用:

[root@svr5 ~]# chmod 644 /tmp/rtest.txt  		//重设权限,无x
[root@svr5 ~]# ls -l /tmp/rtest.txt  			//确认设置结果
-rw-r--r-- 1 root root 33139 12-11 10:52 /tmp/rtest.txt
[root@svr5 ~]# [ -x "/tmp/rtest.txt" ] && echo "可执行" || echo "不可执行"
不可执行

[root@svr5 ~]# chmod +x /tmp/rtest.txt  		//添加x权限
[root@svr5 ~]# [ -x "/tmp/rtest.txt" ] && echo "可执行" || echo "不可执行"
可执行

步骤三:整数值比较
参与比较的必须是整数(可以调用变量),比较非整数值时会出错:

[root@svr5 ~]# A=20.4
[root@svr5 ~]# [ $A -gt 10 ]  				//不支持小数比较
-bash: [: 20.4: integer expression expected

1)-eq 比较两个数是否相等。

[root@svr5 ~]# X=20  						//定义一个测试变量
[root@svr5 ~]# [ $X -eq 20 ] && echo "相等" || echo "不相等"
相等
[root@svr5 ~]# [ $X -eq 30 ] && echo "相等" || echo "不相等"
不相等

2)-ne 比较两个数是否不相等。

[root@svr5 ~]# [ $X -ne 20 ] && echo "不等于" || echo "等于"
等于
[root@svr5 ~]# [ $X -ne 30 ] && echo "不等于" || echo "等于"
不等于

3)-gt 比较前面的整数是否大于后面的整数。

[root@svr5 ~]# [ $X -gt 10 ] && echo "大于" || echo "否"
大于
[root@svr5 ~]# [ $X -gt 20 ] && echo "大于" || echo "否"
否
[root@svr5 ~]# [ $X -gt 30 ] && echo "大于" || echo "否"
否

4)-ge 比较前面的整数是否大于或等于后面的整数。

[root@svr5 ~]# [ $X -ge 10 ] && echo "大于或等于" || echo "否"
大于或等于
[root@svr5 ~]# [ $X -ge 20 ] && echo "大于或等于" || echo "否"
大于或等于
[root@svr5 ~]# [ $X -ge 30 ] && echo "大于或等于" || echo "否"
否

5)-lt 比较前面的整数是否小于后面的整数。

[root@svr5 ~]# [ $X -lt 10 ] && echo "小于" || echo "否"
否
[root@svr5 ~]# [ $X -lt 20 ] && echo "小于" || echo "否"
否
[root@svr5 ~]# [ $X -lt 30 ] && echo "小于" || echo "否"
小于

6)-le 比较前面的整数是否小于或等于后面的整数。

[root@svr5 ~]# [ $X -le 10 ] && echo "小于或等于" || echo "否"
否
[root@svr5 ~]# [ $X -le 20 ] && echo "小于或等于" || echo "否"
小于或等于
[root@svr5 ~]# [ $X -le 30 ] && echo "小于或等于" || echo "否"
小于或等于

7)提取当前登录的用户数,比较是否超过5。

[root@svr5 ~]# who | wc -l  					//确认已登录的用户数
4
[root@svr5 ~]# N=$(who | wc -l)  			//赋值给变量N
[root@svr5 ~]# [ $N -gt 5 ] && "超过了" || echo "没超过"
没超过
上述赋值给变量N及与5比较的操作,可以简化为如下形式:
[root@svr5 ~]# [ $(who | wc -l) -gt 5 ] && "超过了" || echo "没超过"
没超过

步骤四:字符串匹配
1)== 比较两个字符串是否相同
检查当前用户是否为root。
当root用户执行时:

[root@svr5 ~]# [ $USER == "root" ] && echo "YES" || echo "NO"
YES
当普通用户执行时:
[zengye@svr5 ~]$ [ $USER == "root" ] && echo "YES" || echo "NO"
NO

2)!= 比较两个字符串是否不相同
检查当前用户,如果不是root,显示“禁止访问”,如果是root,显示“欢迎”。
当普通用户执行时:

[zengye@svr5 ~]$ [ $USER != "root" ] && echo "禁止访问" || echo "欢迎"
禁止访问
当root用户执行时:
[root@svr5 ~]# [ $USER != "root" ] && echo "禁止访问" || echo "欢迎"
欢迎

3)-z 检查变量的值是否未设置(空值)

[root@svr5 ~]# var1="Tarena" ; var2=""
[root@svr5 ~]# [ -z "$var1" ] && echo "空值" || echo "非空值"
非空值
[root@svr5 ~]# [ -z $var2 ] && echo "空值" || echo "非空值"
空值  									//变量var2已设置,但无任何值,视为空
[root@svr5 ~]# var2=" "  				//为变量var2赋值为一个空格
[root@svr5 ~]# [ -z "$var2" ] && echo "空" || echo "非空"
非空  									//空格视为有效字符,所以非空
[root@svr5 ~]# [ -z $var3 ] && echo "空值" || echo "非空值"
空值   									//变量var3未设置,也视为空

4)-n 检查变量的值是否不为空,等效于 ! -z

[root@svr5 ~]# [ -n "$var2" ] && echo "不为空" || echo "为空"
不为空
[root@svr5 ~]# [ -n "$var3" ] && echo "不为空" || echo "为空"
为空

步骤五:多个条件/操作的逻辑组合
1)&&,逻辑与
给定条件必须都成立,整个测试结果才为真。
检查变量X的值是否大于10,且小于30:

[root@svr5 ~]# X=20  					//设置X变量的值为20
[root@svr5 ~]# [ $X -gt 10 ] && [ $X -lt 30 ] && echo "YES"
YES

多个条件组合时,可以使用 [[ … ]] 界定,比如上述测试可以改为如下:

[root@svr5 ~]# [[ $X -gt 10 && $X -lt 30 ]] && echo "YES"
YES

2)||,逻辑或
只要其中一个条件成立,则整个测试结果为真。
检查变量X的值是否小于10或者小于30:

[root@svr5 ~]# [[ $X -lt 10 || $X -lt 30 ]] && echo "YES"
YES

只要/tmp/、/var/spool/目录中有一个可写,则条件成立:

[root@svr5 ~]# [ -w "/tmp/" ] || [ -w "/var/spool/" ] && echo "OK"
OK

标签:tmp,&&,svr5,echo,测试,条件,操作,txt,root
来源: https://blog.csdn.net/qq_43237999/article/details/90639049