Shell脚本中经常需要判断某情况或者数据是否满足,需要由测试机制来实现。

测试方式

  • echo $?查看命令执行状态返回值
    bash脚本中可以自定义返回值exit n(n为自己指定的状态码),shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束;
0:成功
1-255:失败
  • 测试表达式
# EXPRESSION两端必须有空白字符,否则为语法错误;
test  EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

测试类型

  • 数值测试
-eq:是否等于; [ $num1 -eq $num2 ]
-ne:是否不等于;
-gt:是否大于;
-ge:是否大于等于;
=-lt:是否小于;
=-le:是否小于等于;

示例

# 测试2等于3
[root@VM_41_201_centos sh]# test 2 -eq 3
[root@VM_41_201_centos sh]# echo $?
1
# 测试2不等于3
[root@VM_41_201_centos sh]# test 2 -ne 3
[root@VM_41_201_centos sh]# echo $?
0
# a=2,b=1,测试a大于b
[root@VM_41_201_centos sh]# a=2
[root@VM_41_201_centos sh]# b=1
[root@VM_41_201_centos sh]# [ $a -gt $b ]
[root@VM_41_201_centos sh]# echo $?
0
  • 字符串测试
# 注意:(1) 字符串要加引用;(2) 要使用[[ ]];
==:是否等于;
>:是否大于;
<:是否小于;
!=:是否不等于;
=~:左侧字符串是否能够被右侧的PATTERN所匹配;
-z "STRING":判断指定的字串是否为空;空则为真,不空则假;
-n "STRING":判断指定的字符串是否不空;不空则真,空则为假;						

示例

# 测试“a”等于“b”
[root@VM_41_201_centos sh]# [[ "a" == "b" ]]
[root@VM_41_201_centos sh]# echo $?
1
# 测试“abc123”匹配模式a*
[root@VM_41_201_centos sh]# [[ "abc123" =~ a* ]]
[root@VM_41_201_centos sh]# echo $?
0
# 测试变量test是否为空
[root@VM_41_201_centos sh]# [[ -z $test ]]
[root@VM_41_201_centos sh]# echo $?
0
  • 文件测试
# 存在性测试
-a  FILE
-e  FILE
# 存在性及类型测试
-b  FILE:是否存在并且为 块设备 文件;
-c  FILE:是否存在并且为 字符设备 文件;
-d  FILE:是否存在并且为 目录文件;
-f  FILE:是否存在并且为 普通文件;
-h  FILE或 -L  FILE:是否存在并且为 符号链接文件;
-p FILE:是否存在且为 命名管道文件;
-S  FILE:是否存在且为 套接字文件;
# 文件权限测试
-r  FILE:是否存在并且 对当前用户可读;
-w  FILE:是否存在并且 对当前用户可写;
-x  FILE:是否存在并且 对当前用户可执行;
# 特殊权限测试
-u  FILE:是否存在并且 拥有suid权限;
-g  FILE:是否存在并且 拥有sgid权限;
-k  FILE:是否存在并且 拥有sticky权限;
# 文件是否有内容
-s  FILE:是否有内容;
# 时间戳
-N FILE:文件自从上一次读操作后是否被修改过;
# 从属关系测试
-O  FILE:当前用户是否为文件的属主;
-G  FILE:当前用户是否属于文件的属组;
# 双目测试
FILE1  -ef  FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接;
FILE1  -nt  FILE2:FILE1是否新于FILE2;
FILE1  -ot  FILE2:FILE1是否旧于FILE2;

组合测试

bash脚本中支持讲多个测试条件组合,一般为逻辑与、或、非等。

组合测试的两种方式:

# 1.&&、||、!
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND 
如:[ -O FILE ] && [ -r FILE ]
# 2.-a、-o
EXPRESSION1  -a  EXPRESSION2
EXPRESSION1  -o  EXPRESSION2
! EXPRESSION
如:[ -O FILE -a -x FILE ]