1. 简介

命令格式:

# 格式1
test condition
# 格式2,注意中括号前后都有空格
[ condition ]

命令解释:
condition是test命令要测试的一系列参数和值,如果成立则退出状态码为0,否则为非0,因此在分支和循环中可以使用test命令进行流程控制)。

test命令可以判断三类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

2. 数值比较

使用test命令最常见的情形是对两个数值进行比较。如下表所示:

比 较

描 述

n1 -eq n2

检查n1是否与n2相等

n1 -ge n2

检查n1是否大于或等于n2

n1 -gt n2

检查n1是否大于n2

n1 -le n2

检查n1是否小于或等于n2

n1 -lt n2

检查n1是否小于n2

n1 -ne n2

检查n1是否不等于n2

2.1 数值比较示例

#            $?用于返回上个命令退出状态码

#@@@@ -eq测试
# 1 -eq 2条件不成立,因此退出状态码非0(此处为1)
[root@vm14 ~]# test 1 -eq 2 ; echo $?
1
# 1 -eq 1条件成立,因此退出状态码为0
[root@vm14 ~]# test 1 -eq 1 ; echo $?
0

#@@@@ -ne测试
# 条件1 -ne 1不成立,因此退出状态码为非0(此处为1)
[root@vm14 ~]# [ 1 -ne 1 ]; echo $?
1
# 添加1 -ne 2成立,因此退出状态码为0
[root@vm14 ~]# [ 1 -ne 2 ]; echo $?
0

2.2 使用双括号

双括号命令允许你在比较过程中使用高级数学表达式。格式:(( expression ))

双括号命令符号

符 号

描 述

val++

后增

val–

后减

++val

先增

–val

先减

!

逻辑求反

~

位求反

**

幂运算

<<

左位移

>>

右位移

&

位布尔和

|

位布尔或

&&

逻辑和

||

逻辑或

# 双括号中的空格时可以省略的
[root@vm14 ~]# (( 2>1 ));echo $?
0
[root@vm14 ~]# (( 2<1 ));echo $?
1

3. 字符串比较

条件测试还允许比较字符串值。如下表所示:

比 较

描 述

str1 = str2

检查str1是否和str2相同

str1 != str2

检查str1是否和str2不同

str1 < str2

检查str1是否比str2小

str1 > str2

检查str1是否比str2大

-n str1

检查str1的长度是否非0

-z str1

检查str1的长度是否为0

3.1 是否相等

#@@@@ =测试
# 条件"str1" = "str2"条件不成立,因此退出状态码非0(此处为1)
[root@vm14 ~]# [ "str1" = "str2" ]; echo $?
1
# 条件"str1" = "str1"条件成立,因此退出状态码为0
[root@vm14 ~]# [ "str1" = "str1" ]; echo $?
0

3.2 大小判断

当进行字符串大于或小于排序时,需要对> < 符号进行转义

#@@@@ >< 测试
# 条件"str1" > "str2"不成立,因此退出状态码为非0(此处为1)
[root@vm14 ~]# [ "str1" \> "str2" ]; echo $?
1
# 条件"str1" < "str2"成立,因此退出状态码为0
[root@vm14 ~]# [ "str1" \< "str2" ]; echo $?
0
# 在比较大小写时,test命令与sort结果相反,test是正常逻辑(ASCII值比较--与java一致)
# sort命令使用的是系统的本地化语言设置中定义的排序顺序。对于英语,本地化设置指定了在排序顺序中小写字母出现在大写字母前
# sort命令认为小写a小于大写A
[root@vm14 ~]# echo -e "A\na" |sort 
a
A
# test命令认为小写a大于大写A
[root@vm14 ~]# [ "a" \> "A" ] ; echo $?
0

3.3 是否为空

#@@@@ -n -z测试
# 当你什么也不传的时候,这里命令退出状态码都为0
[root@vm14 ~]# [ -n  ] ; echo $?
0
[root@vm14 ~]# [ -z  ] ; echo $?
0
# 因此当你检测变量是否为空时要特别小心,因为你没法判断出来正确的结果
[root@vm14 ~]# [ -n $not_exist ] ; echo $?
0
[root@vm14 ~]# [ -z $not_exist ] ; echo $?
0
# 选择1:加上双引号
[root@vm14 ~]# [ -z "$not_exist" ] ; echo $?
0
[root@vm14 ~]# [ -n "$not_exist" ] ; echo $?
1
# 选择2:使用双方括号: [[ condition ]]
[root@vm14 ~]# [[ -z $not_exist ]] ; echo $?
0
[root@vm14 ~]# [[ -n $not_exist ]] ; echo $?
1

3.4 模式匹配

双方括号命令提供了针对字符串比较的高级特性-模式匹配。双方括号命令的格式如下: [[ expression ]]

# 测试字符串root是否以r开头
[root@vm14 ~]# [[ "root" = r* ]]; echo $?
0
# 测试字符串root是否以a开头
[root@vm14 ~]# [[ "root" = a* ]]; echo $?
1

3. 文件比较

文件比较允许你测试Linux文件系统上文件和目录的状态。如下表所示:

比 较

描 述

-d file

检查file是否存在并是一个目录

-e file

检查file是否存在

-f file

检查file是否存在并是一个文件

-r file

检查file是否存在并可读

-s file

检查file是否存在并非空

-w file

检查file是否存在并可写

-x file

检查file是否存在并可执行

-O file

检查file是否存在并属当前用户所有

-G file

检查file是否存在并且默认组与当前用户相同

file1 -nt file2

检查file1是否比file2新

file1 -ot file2

检查file1是否比file2旧

3.1 文件or目录

# 创建测试用目录和文件
[root@vm14 ~]# mkdir testdir
[root@vm14 ~]# touch testdir/testfile

# 判断是否为目录
[root@vm14 ~]# [ -d testdir ]; echo $?
0
[root@vm14 ~]# [ -d testdir/testfile ]; echo $?
1
# 判断是否为文件
[root@vm14 ~]# [ -f testdir ]; echo $?
1
[root@vm14 ~]# [ -f testdir/testfile ]; echo $?
0

# 删除测试目录
[root@vm14 ~]# rm -rf testdir/

3.2 检查文件权限

# 创建测试文件
[root@vm14 ~]# touch testfile
# 查看文件权限,此时具备读写权限,不具备执行权限
[root@vm14 ~]# ll testfile 
-rw-r--r--. 1 root root 0 2020-04-12 13:26:09 testfile
# 读、写、执行权限测试
[root@vm14 ~]# [ -r testfile ]; echo $?
0
[root@vm14 ~]# [ -w testfile ]; echo $?
0
[root@vm14 ~]# [ -x testfile ]; echo $?
1

# 删除文件