条件测试(test)命令共有三类条件测试表达式:
第一类是进行数值的比较,第二类是进行字符串的比较,第三类是进行文件的测试,例如测试一个文件是否存在等等。
1.数值测试,需要两个操作数进行比较,即为双目测试符;
-eq:测试两个数值是否相等;相等为真,不等为假;
-ne:测试两个数值是否不等;不等为真,相等为假;
-lt:小于,测试左边数值是否小于右边的数值;小于为真,不小于为假;
-gt:大于,测试左边数值是否大于右边的数值;大于为真,不大于为假;
-le:小于等于,测试左边数值是否不大于右边数值;不大于为真,大于为假;
-ge:大于等于,测试左边数值是否不小于右边数值;不小于为真,小于为假;
总结:eq相等,ne不相等,gt大于,lt小于,le小于等于,ge 大于等于
例如:
[root@localhost ~]# test 1 -eq 2
[root@localhost ~]# echo $?
1
[root@localhost ~]# test 1 -ne 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 -lt 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 -gt 2
[root@localhost ~]# echo $?
1
[root@localhost ~]# test 1 -le 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 -ge 2
[root@localhost ~]# echo $?
1
也可以用 [ ]
例如:
[root@localhost ~]# [ 1 -eq 2 ]
[root@localhost ~]# echo $?
1
效果是一样的,要注意的是如果使用[]或[[]]进行条件判断,在表达式的两端都有留有空白字符,以区分命令和参数之间的关系;
注意:这类命令一般没有执行结果,只有执行状态返回值,所以当我们要查看比对结果的时候需要使用echo命令将执行的结果显示出来。
2.字符串测试:
双目操作符:
==|=:被测试的两个字符串是否相等,相同为真,不同为假;
例如:
~]$ [[ abc == abc ]]
~]$
echo
$?
0
~]$ [[ abc == aba ]]
~]$
echo
$?
1
!=:被测试的两个字符是否不相同,不同为真,相同为假; 这个符号的功能与==相反;
例如:
~]$ [[ abc != abc ]]
~]$
echo
$?
1
~]$ [[ abc != aba ]]
~]$
echo
$?
0
>:测试左边的字符串所对应的ASCII编码是否比右边的字符串对应的ASCII编码大;大于为真,小于为假;
<:测试左边的字符串所对应的ASCII编码是否比右边的字符串对应的ASCII编码小;小于为真,大于为假;
例如:
~]$ [[ abc < abd ]]
~]$
echo
$?
0
~]$ [[ abc < abb ]]
~]$
echo
$?
1
=~:被测试的两个字符串,左边字符串能否被右边的字符串匹配,能匹配为真,不能匹配为假;
例如:
~]$ [[ abc =~ aba ]]
~]$
echo
$?
1
~]$ [[ abcdef =~ abc ]]
~]$
echo
$?
0
注意:>, <, =~这三类测试操作符只能用在[[ expression ]]测试语句中,在单个[ ]是使用不了的;
单目操作符:
-z 'STRING':测试STRING是否为空串;空串为真,不空为假;
-n 'STRING':测试STRING是否为非空串;不空为真,空串为假;
注意:
1) 通常情况下,字符串是要用引号引用的,单引号或双引号都可以,只有在特定的情况下,只能选择单引号或双引号之一;
2) []和[[]]在某些情况下,意义不完全相同,要区分对待;
3) 如果使用[]或[[]]进行条件判断,在表达式的两端都有留有空白字符,以区分命令和参数之间的关系;
4) 所有的双目测试操作符和参数之间也要留有空白字符空间;
3.文件测试:
1)文件存在性测试
-a file:测试的文件存在为真,不存在为假;
-e file:测试的文件存在为真,不存在为假;
2)文件类型测试
-b file:被测试的文件是否存在并且是否为块设备;
-c file:被测试文件是否存在并且为字符设备;
-d file:被测试文件是否存在并且为目录设备;
-f file:被测试文件是否存在并且为普通文件;
-h|-L file:被测试的文件是否存在并且是否为符号链接文件;
-s FILE:测试文件是否存在且其大小大于0;
-S file:被测试文件是否存在并且是否为套接字文件;
-t file:测试文件描述符是否在终端上被打开;
3)文件的访问权限设置:
-r file:被测试文件是否存在,并且当前有效用户是否可读;
-w file:被测试文件是否存在,并且当前有效用户是否可写;
-x file:被测试文件是否存在,并且当前有效用户是否可执行;
4)文件特殊权限标识测试:
-u file:被测试的文件是否存在并且设置了SUID权限;
-g file:被测试文件是否存在并且设置了SGID权限;
-k file:被测试的文件是否存在并且是否设置了sticky权限;
5)文件所有权测试:
-O file:被测试的文件是否存在并且其属主是否为当前有效用户;
-G file:被测试的文件是否存在并且其属组是否为当前有效用户的所在组;
6)时间戳测试:
-N file:被测试文件自从上一次被修改之后,是否被修改过;
7)双目测试:
file1 -ef file2 :测试的两个文件是否指向同一个文件系统的相同inode的
8)硬链接测试:
file1 -nt file2:被测试的两个文件,file1是否比file2更新;
file1 -ot file2:被测试的两个文件,file1是否比file2更旧;
测试语句中可以添加逻辑运算:
第一种表达式:
[ expression1 ] && [ expression2 ]
[ expression1 ] || [ expression2 ]
! [ expression ]
第二种表达式:
[ expression1 -a expression2 ]
[ expression1 -o expression2 ]
[ ! expression ]
在命令执行后会有一个结果的返回值,这个返回值分两种,第一种是正常的命令的输出结果,第二种是这个命令执行的状态,有的时候可能会没有第一种返回值,但一定会有第二种状态返回值。状态返回值的数字保存在“?”这个变量中,可以通过“echo $?”命令进行查看。根据不同的状态返回值的数字,我们可以判断命令执行的状态,命令的执行结果如下:
0:成功
1,2,127:为系统保留的状态返回值,在我们自己编写脚本的时候尽量避开这些
3-126,128-255:用户自定义的执行状态返回值
注意:
当shell脚本运行时,一旦遇到exit命令,将立即结束运行此脚本的shell进程,同时此脚本的运行也会停止,其后续的所有命令都不会再被解释执行;因此,包含了exit命令的脚本,不要使用source命令来执行;