《Shell 编程》05_Shell 脚本的条件测试与比较
标签(空格分隔): Shell
文章目录
5.1 Shell 脚本的条件测试
条件测试语法 |
---|
语法1:test <测试表达式> |
语法2:[<测试表达式>] |
语法3:[[<测试表达式>]] |
语法4:((<测试表达式>)) |
- 除 (()) 两端不需要空外,其余 test 、[]、[[]] 内容两端均需空格。
- test 和 [] 是等价的。[[]] 为 test 的扩展命令,(()) 常用于计算。
- [[]] 可以使用通配符等进行模式匹配。
5.1.1 test
语法格式:test <测试表达式>
1)-f 选项(文件存在且为普通文件则表达式成立)
- 若文件 file 存在,则输出 true,否则输出 false。
- && 和 || 两端可有空格,也可以无空格。
test -f file && echo true || echo false
2)一半逻辑
test -f file echo 1 #<== 若表达式成功,则输出1
test -f file echo 0 #<== 若表达式不成功,则输出0
3)示例
[root@web001 scripts]# test -f file && echo 1 || echo 0
0
[root@web001 scripts]# touch file
[root@web001 scripts]# test -f file && echo 1 || echo 0
1
4) -z 选项(如测试字符串的长度为0,则表达式成立)
[root@web001 scripts]# test -z "ylt" && echo 1 || echo 0
0
[root@web001 scripts]# test -z "" && echo 1 || echo 0
1
5.1.2 [](中括号)
语法格式:[<测试表达式>] 中括号内两端需要空格
1)若文件 file 存在,则输出 true,否则输出 false。
[ -f file ] && echo true || echo false
2)一半逻辑
[ -f file ] echo 1 #<== 若表达式成功,则输出1
[ -f file ] echo 0 #<== 若表达式不成功,则输出0
3)示例
[root@web001 scripts]# [ -f file ] && echo 1 || echo 0
0
[root@web001 scripts]# touch file
[root@web001 scripts]# [ -f file ] && echo 1 || echo 0
1
5.1.3 [[]]
语法格式:[[<测试表达式>]] 双中括号内两端需要空格
1)若文件 file 存在,则输出 true,否则输出 false。
[[ -f file ]] && echo true || echo false
2)一半逻辑
[[ -f file ]] echo 1 #<== 若表达式成功,则输出1
[[ -f file ]] echo 0 #<== 若表达式不成功,则输出0
3)示例
[root@web001 scripts]# [[ -f file ]] && echo 1 || echo 0
0
[root@web001 scripts]# touch file
[root@web001 scripts]# [[ -f file ]] && echo 1 || echo 0
1
5.2 文件测试表达式
常用文件测试操作符 | 说明 |
---|---|
-d 文件,directory | 文件存在且为目录则为真,即测试表达式成立 |
-f 文件,file | 文件存在且为普通文件则为真,即测试表达式成立 |
-e 文件,exist | 文件存在则为真,即测试表达式成立,-e 不辨别文件还是目录 |
-r 文件,read | 文件存在且可读则为真,即测试表达式成立 |
-s 文件,size | 文件存在且文件大小不为 0 则为真,即测试表达式成立 |
-w 文件,write | 文件存在且可写则为真,即测试表达式成立 |
-x 文件,executable | 文件存在且可执行则为真,即测试表达式成立 |
-L 文件,link | 文件存在且为链接文件则为真,即测试表达式成立 |
-d 文件,directory | 文件存在且为目录则为真,即测试表达式成立 |
f1 nt f2,newer than | 文件 f1 比 文件 f2 新则为真,即测试表达式成立。根据文件的修改时间来计算 |
f1 ot f2,older than | 文件 f1 比 文件 f2 旧则为真,即测试表达式成立。根据文件的修改时间来计算 |
1)测试文件的读、写、执行等属性,不光是根据文件属性 rwx 的标识来判断,还要看当前执行测试的用户是否真的按照对应的权限操作该文件。
[root@web001 scripts]# ll file
-rw-r--r-- 1 root root 0 Oct 24 03:57 file
[root@web001 scripts]# [ -r file ] && echo 1 || echo 0
1
[root@web001 scripts]# [ -w file ] && echo 1 || echo 0
1
[root@web001 scripts]# [ -x file ] && echo 1 || echo 0
0
[root@web001 scripts]# chmod 001 file
[root@web001 scripts]# ll file
---------x 1 root root 0 Oct 24 03:57 file
[root@web001 scripts]# [ -w file ] && echo 1 || echo 0
1
[root@web001 scripts]# echo "echo test" >file
[root@web001 scripts]# [ -r file ] && echo 1 || echo 0
1
[root@web001 scripts]# cat file
echo test
[root@web001 scripts]# [ -x file ] && echo 1 || echo 0
1
[root@web001 scripts]# ./file
test
2)[] 测试变量需要加双引号
[root@web001 scripts]# echo $ylt
[root@web001 scripts]# [ -f $ylt ] && echo 1 || echo 0
1
[root@web001 scripts]# [ -f "$ylt" ] && echo 1 || echo 0
0
3)特殊测试表达式
- 判断条件测试表达式的条件成立或不成立后,还需执行多条命令语句的语法形式:
[ 条件1 ] && {
命令1
命令2
命令3
}
[[ 条件1 ]]
|| {
命令1
命令2
命令3
}
test 条件1 && {
命令1
命令2
命令3
}
相当于
if [ 条件1 ]
then
命令1
命令2
命令3
fi
5.4 字符串测试表达式
常用字符串测试操作符 | 说明 |
---|---|
-n “字符串” | 若字符串的长度不为 0,则为真。 |
-z “字符串” | 若字符串的长度为 0,则为真。 |
“串1” = “串2” | 若字符串1等于字符串2,则为真 |
“串1” != “串2” | 若字符串1不等于字符串2,则为真 |
- 对于字符串的测试,一定要将字符串加双引号之后再进行比较,特别是使用 [] 的场景。
- 比较符号(例如 = 和 !=)两端一定要有空格。
5.5 整数二元比较操作符
在 [] 以及 test 中使用的比较符号 | 在 [[]] 及 (()) 中使用的比较符号 | 说明 |
---|---|---|
-eq | == 或 = | 相等,equal |
-ne | != | 不相等,not equal |
-gt | > | 大于,greater than |
-ge | >= | 大于等于,greater equal |
-lt | < | 小于,less than |
-le | <= | 小于等于,less equal |
- “=” 和 “!=” 也可在 [] 中使用,但在 [] 中使用包含 “>” 和 “<” 的符号时,需要反斜线转义。
- 也可在 [[]] 中使用包含 “-gt” 和 “-lt” 的符号。
5.6 逻辑操作符
在 [] 以及 test 中使用的操作符 | 在 [[]] 及 (()) 中使用的操作符 | 说明 |
---|---|---|
-a | && | and,与,两端都为真,则结果为真 |
-o | || | or,或,两端有一个为真,则结果为真 |
! | ! | not,非,两端相反,则结果为真 |
- 连接两含 [] 、test 或 [[]] 的表达式可用 && 或 ||。
- 在 [[]] 通配符匹配的场景下,其他测试表达式无法替代。因此,如果需要通配符或正则表达式就用 [[]]。
5.7 测试表达式 test、 [] 、(()) 、[[]] 的区别总结
测试表达式符号 | [] | test | [[]] | (()) |
---|---|---|---|---|
边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
逻辑操作符 | !、-a、-o | !、-a、-o | !、&&、|| | !、&&、|| |
整数比较操作符 | -eq、-ne、-gt、-lt、-ge、-le | -eq、-ne、-gt、-lt、-ge、-le | -eq、-ne、-gt、-lt、-ge、-le 或 =、>、<、>=、<= | =、>、<、>=、<= |
字符串比较操作符 | =、==、!= | =、==、!= | =、==、!= | =、==、!= |
是否支持通配符匹配 | 不支持 | 不支持 | 支持 | 不支持 |