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
# 删除文件