在linux shell编程使用的过程中,难免会遇到一些测试和比较问题。shell提供了test命令,方便进行测试比较操作。test不仅可以测试逻辑表达式,还可以进行文件,数字,字符串的比较。本文是一些常见用法的学习总结。
在介绍test命令之前,先简单介绍下shell命令的返回值含义。在shell中,如果命令返回0,则表示成功;任何非0的返回值,都表示失败;同时shell提供了特殊参赛$?来获取上个命令的返回值。
文件比较操作
test命令,支持文件比较操作。主要可以比较两个文件是否为同一个文件,两个文件修改时间的先后。
命令参数 | 含义 |
---|---|
FILE1 -ef FILE2 | 两个文件指向同一个inode,既是硬链接,则为真 |
FILE1 -nt FILE2 | FILE1比FILE2更新,既FILE1修改时间晚于FILE2,则为真 |
FILE1 -ot FILE2 | FILE1比FILE2更旧,既FILE1修改时间早于FILE2,则为真 |
在下面的例子中,分别有三个文件,其中file2.txt是file1.txt的硬链接。
shuanghu@shuanghu:test_command$ls -l
-rw-rw-r-- 2 shuanghu shuanghu 0 5月 14 12:21 file1.txt
-rw-rw-r-- 2 shuanghu shuanghu 0 5月 14 12:21 file2.txt
-rw-rw-r-- 1 shuanghu shuanghu 0 5月 14 12:22 file3.txt
shuanghu@shuanghu:test_command$ test file1.txt -ef file2.txt ;echo $?
1
shuanghu@shuanghu:test_command$ test file1.txt -ef file3.txt ;echo $?
0
shuanghu@shuanghu:test_command$ test file1.txt -nt file3.txt;echo $?
0
shuanghu@shuanghu:test_command$ test file1.txt -ot file3.txt ;echo $?
1
文件属性操作
test命令可以判断文件是否存在,以及侦测各种的文件属性。
命令参数 | 含义 |
---|---|
-b file | file存在,并且为块特殊文件,则为真 |
-c file | file存在,并且为字符特殊文件,则为真 |
-d file | file存在,并且为目录,则为真 |
-e file | file存在,则为真 |
-f file | file存在,并且为常规文件,则为真 |
-g file | file存在,并且设置了文件的 SGID 位,则为真 |
-G file | file存在,并且为组所有,则为真 |
-r file | file存在,并且有读权限,则为真 |
-s file | file存在,并且长度大于0,则为真 |
-w file | file存在,并且有写权限,则为真 |
-x file | file存在,并且有执行权限,则为真 |
算术比较运算
在shell中,test命令可以比较两个数字的大小,相等等。
操作符 | 含义 |
---|---|
num1 -eq num2 | 两个数字相等,则为真 |
num1 -ge num2 | num1大于等于num2,则为真 |
num1 -gt num2 | num1大于num2,则为真 |
num1 -le num2 | num1小于等于num2,则为真 |
num1 -lt num2 | num1小于num2,则为真 |
num1 -ne num2 | num1不等于num2,则为真 |
使用例子如下:
shuanghu@shuanghu:tmp$ test 1 -eq 2 ;echo $?
1
shuanghu@shuanghu:tmp$ test 1 -ge 2 ;echo $?
1
shuanghu@shuanghu:tmp$ test 1 -gt 2 ;echo $?
1
shuanghu@shuanghu:tmp$ test 1 -le 2 ;echo $?
0
shuanghu@shuanghu:tmp$ test 1 -lt 2 ;echo $?
0
shuanghu@shuanghu:tmp$ test 1 -ne 2 ;echo $?
0
字符串比较运算
shell中,test命令,也可以进行字符串的比较。包括判断字符串是否为空,大于,小于,等于等常见操作。
具体shell中字符串的操作,可以详细见本人的另外一篇博客《shell编程学习–字符串的使用操作》
逻辑运算
test可以进行基本的逻辑运算
表达式 | 含义 |
---|---|
test EXPRESSION | EXPRESSION表达式为真,则结果为真 |
test ! EXPRESSION | EXPRESSION表达式为假,则结果为真 |
test EXPRESSION1 -a EXPRESSION2 | 逻辑与,EXPRESSION1与EXPRESSION2都为真,结果为真 |
test EXPRESSION1 -o EXPRESSION2 | 逻辑或,EXPRESSION1与EXPRESSION2有一个为真,结果为真 |
shuanghu@shuanghu:tmp$ test 1 -lt 2 ;echo $?
0
shuanghu@shuanghu:tmp$ test ! 1 -gt 2 ;echo $?
0
shuanghu@shuanghu:tmp$ test 1 -lt 2 -a 2 -eq 2;echo $?
0
shuanghu@shuanghu:tmp$ test 1 -lt 2 -o 2 -ne 2;echo $?
0