这篇文章上次修改于 414 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

test 命令

  • test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真


[root@master236 ~]# test 1 -gt 2 && echo "对" || echo "错误" 错误

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真


[root@master236 ~]# cardName="card" [root@master236 ~]# hcardName="hcard" [root@master236 ~]# if test ${cardName} == ${hcardName}; then echo "同一张卡"; else echo "不同的卡"; fi 不同的卡 [root@master236 ~]# hcardName="card" [root@master236 ~]# if test ${cardName} == ${hcardName}; then echo "同一张卡"; else echo "不同的卡"; fi 同一张卡

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真


[root@master236 ~]# test -e test.sh && echo "文件存在" 文件存在 [root@master236 ~]# test -e test.nsh && echo "文件存在" || echo "文件不存在" 文件不存在
  • Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低

[root@master236 ~]# test -e test.sh -a -e pdfContract && echo "2个文件都存在" 2个文件都存在

[] 中括号

  • [] 是shell的内置关键字,基本等价于test命令
[root@master236 ~]# [ -x test.sh ] && echo "true" || echo "false"
false
[root@master236 ~]# [ -f test.sh -o -f jenkins ] && echo "true" || echo "false"
true

[[]] 双中括号

  • [[]] 是shell的内置关键字,可以看成是[] 的升级版本
  • 允许在双中括号内使用逻辑运算符"&&"、"||"、"!"和"()"
  • 支持正则表达式
  • 不需要、也不能对 >、< 进行转义,转义后会出错
  • 不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错
  • 剔除了 test 命令的-o和-a选项,你只能使用 || 和 &&

root@master236 ~]# title1="标题1" [root@master236 ~]# [[ -z $title1 && -z $title2 ]] && echo "都是空字符" || echo "至少有一个不是空字符" 至少有一个不是空字符 [root@master236 ~]# title1="" [root@master236 ~]# [[ -z $title1 && -z $title2 ]] && echo "都是空字符" || echo "至少有一个不是空字符" 都是空字符 [root@master236 ~]# read -p "请输入手机号: " tel 请输入手机号: 17688965431 [root@master236 ~]# echo $tel 17688965431 [root@master236 ~]# [[ $tel =~ ^1[0-9]{10}$ ]] && echo "是手机号" || echo "不是手机号" 是手机号