条件测试操作

    xiaoxiao2025-05-18  40

    2.条件测试操作 问题 本案例要求参考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 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 12: X -gt 20 ] &̲& echo "YES" ||…?。比如,若要检查一个软件包是否安装,正常可以执行“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 KaTeX parse error: Expected 'EOF', got '#' at position 38: …: [root@svr5 ~]#̲ rpm -q httpd &… [ -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 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 12: X -le 30 ] &̲& echo "小于或等于" …(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 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 18: …ER == "root" ] &̲& echo "YES" ||… [ KaTeX parse error: Expected 'EOF', got '&' at position 18: …ER == "root" ] &̲& echo "YES" ||… [ $USER != “root” ] && echo “禁止访问” || echo “欢迎” 禁止访问 当root用户执行时: [root@svr5 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 18: …ER != "root" ] &̲& echo "禁止访问" |…var1" ] && echo “空值” || echo “非空值” 非空值 [root@svr5 ~]# [ -z KaTeX parse error: Expected 'EOF', got '&' at position 8: var2 ] &̲& echo "空值" || …var2" ] && echo “空” || echo “非空” 非空 //空格视为有效字符,所以非空 [root@svr5 ~]# [ -z KaTeX parse error: Expected 'EOF', got '&' at position 8: var3 ] &̲& echo "空值" || …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

    最新回复(0)