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

《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 或 =、>、<、>=、<==、>、<、>=、<=
字符串比较操作符=、==、!==、==、!==、==、!==、==、!=
是否支持通配符匹配不支持不支持支持不支持
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值