《Shell 编程》05_Shell 脚本的条件测试与比较

版权声明: https://blog.csdn.net/weixin_42061048/article/details/83343553

《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]#
[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 或 =、>、<、>=、<= =、>、<、>=、<=
字符串比较操作符 =、==、!= =、==、!= =、==、!= =、==、!=
是否支持通配符匹配 不支持 不支持 支持 不支持

猜你喜欢

转载自blog.csdn.net/weixin_42061048/article/details/83343553