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