RHCE Day 9 SHELL条件测试

SHELL条件测试

条件测试概述

Shell条件测试: 用于判断某个条件是否成立,返回真(0)或假(非0)

基本语法
  • 格式:
shell 复制代码
格式1: test  -参数  条件表达式   → 传统测试
格式2: [  条件表达式  ]   → 传统测试 # 注意:[]的左右要有空格   
格式3: [[  条件表达式  ]] → 增强测试(支持模式匹配、逻辑运算)  # 注意:[]的左右要有空格
格式4: ((条件表达式)) → 整数算术/逻辑测试
  • test单独使用,判断条件为真,echo $?返回0,假返回1
  • test与 等价
  • \[ ] 是扩展命令,可以使用通配符等进行模式匹配,&& || > < 等操作符可以直接应用于双中括号中,但不能用于单中括号中
  • (()) 一般用于if语句里,两端不需要有空格,测试对象为整数
  • 简而言之:用来检查文件状态、字符串关系或数值关系,并根据结果控制程序流。

文件测试

常用的文件测试操作符 说明
-e 文件 文件是否存在
-b 文件 文件是否存在,且为块文件,如果文件存在且是一个块文件,则结果为0
-c 文件 文件是否存在且为字符文件,如果文件存在且是一个字符文件,则结果为0
-L 文件 文件存在且为链接文件则为真
-d 文件 文件存在且为目录则为真,即测试表达式成立
-f 文件 文件存在且为普通文件则为真,即测试表达式成立
-s 文件 文件存在且文件大小不为0则为真
-u 文件 文件是否设置suid位,如果设置了suid,则结果为0
-r 文件 文件存在且可读为真
-w 文件 文件存在且可写为真
-x 文件 文件存在且可执行则为真
f1 -nt f2,nt为newer than 文件f1比文件f2新则为真,根据文件的修改时间来计算
f1 -ot f2,ot为older than 文件f1比文件f2旧则为真,根据文件的修改时间来计算
用法举例
test的用法
shell 复制代码
[root@server ~]# test -f /etc/passwd
[root@server ~]# echo $?
0
[root@server ~]# test -f /etc/passwd && echo 真 || echo 假
真
[root@server ~]# test -f /etc/ssh && echo 真 || echo 假
假
[root@server ~]# test -f /etc/ssh/sshd_config && echo 真 || echo 假
真
[root@server ~]# test -d /etc/ssh && echo 真 || echo 假
真
[root@server ~]# test -e /etc/ssh && echo 真 || echo 假
真
[root@server ~]# test -r /etc/ssh && echo 真 || echo 假
真
[root@server ~]# test -w /etc/ssh && echo 真 || echo 假
真
[root@server ~]# test -x /etc/ssh && echo 真 || echo 假
真
[root@server ~]# test -L /etc/ssh && echo 真 || echo 假
假
[root@server ~]# test -s /etc/passwd && echo 真 || echo 假
真
的用法
shell 复制代码
[root@server ~]# [ -f /etc/cron.d ] && echo true || echo false
false
[root@server ~]# [ -d /etc/cron.d ] && echo true || echo false
true
[root@server ~]# [ -L /etc/cron.d ] && echo true || echo false
false
[root@server ~]# [ -S /etc/cron.d ] && echo true || echo false
false
[root@server ~]# mkfifo pip #创建管道文件
[root@server ~]# [ -p pip ] && echo true || echo false
true

# 逻辑运算
-a与 -o或 !非
\[ ]的用法,\[]是\[\]强化版本,所以\[\]支持的方法\[]完全支持,并且额外支持:
  • 比较运算符无需转义
  • 支持逻辑运算符 && 、||、!
  • 支持模式匹配(正则表达式)
shell 复制代码
[root@server ~]# a=199999999999
[root@server ~]# b=2
[root@server ~]# [ $a \> $b ] && echo true || echo false
false
[root@server ~]# [ $a -gt $b ] && echo true || echo false
true
[root@server ~]# [[ $a > $b ]] && echo true || echo false
false
[root@server ~]# [[ $a -gt $b ]] && echo true || echo false
true
[root@server ~]# [[ $a -lt $b ]] && echo true || echo false
false

[root@server ~]# a=10
[root@server ~]# b=20
[root@server ~]# c=30
[root@server ~]# [[ $a -lt $b && $b -gt $c  ]] && echo true || echo false
false
[root@server ~]# [[ $a -lt $b && $b -lt $c  ]] && echo true || echo false
true

整数测试

作用
  • 用于比较两个数值的大小关系,操作的对象是数值
操作符
在\[\]以及test中使用的比较符号(判断数字) 在(())和\[]中使用的比较符号(判断字符串) 说明
-eq ==或= 相等,全拼为equal
-ne != 不相等,全拼为not equal
-gt > 大于,全拼为greater than
-ge >= 大于等于,全拼为greater equal
-lt < 小于,全拼为less than
-le <= 小于等于,全拼为less equal

在 \[\]中进行字符串比较 可以用比较运算符 部分需要转义,数值比较可以直接使用-eq -lt等选项

\[]中进行字符串比较 可以用比较运算符 不需要转义,数值比较可以直接使用-eq -lt等选项

在 (())中可以直接使用比较运算符 进行数值比较 但不支持字符串比较

shell 复制代码
[root@server ~]# # equal =
[root@server ~]# # greater than >
[root@server ~]# # less than <
[root@server ~]# # greater equal >=
[root@server ~]# # less equal <=
[root@server ~]#
[root@server ~]# # equal =   -eq
[root@server ~]# # greater than >   -gt
[root@server ~]# # less than <     -lt
[root@server ~]# # greater equal >=    -ge
[root@server ~]# # less equal <=    -le
逻辑操作符
在\[\]中使用的逻辑操作符 在test、\[]和(())中使用的逻辑操作符 说明
-a && and,与,两端都为真,则结果为真
-o || or,或,两端有一个为真,则结果为真
not,非,两端相反,则结果为真
相关推荐
tg_xianheyun3 小时前
CDN节点分布如何影响网页加载速度和用户体验
服务器·cdn加速·全球访问优化
lsh曙光3 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫3 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝4 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR1234567884 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8354 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_4 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
夏殇之殁5 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
龙仔7255 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
我不管我就要叫小猪5 小时前
嵌入式Linux----网络通信
linux·运维·服务器