test 命令是 Bash 中重要的判断命令,也是 Shell 脚本中条件判断的重要辅助工具。当我们需要让程序自动判断哪些事情是成立的时,test 命令就派上用场了。
根据表 1,我们先来看看 test 可以进行哪些文件类型的判断。
测试选项 | 作 用 |
---|---|
-b 文件 | 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) |
-c 文件 | 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) |
-d 文件 | 判断该文件是否存在,并且是否为目录文件(是目录文件为真) |
-e 文件 | 判断该文件是否存在(存在为真) |
-f 文件 | 判断该文件是否存在,井且是否为普通文件(是普通文件为真) |
-L 文件 | 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真〉 |
-p 文件 | 判断该文件是否存在,并且是否为管道文件(是管道文件为真) |
-s 文件 | 判断该文件是否存在,并且是否为非空(非空为真) |
-S 文件 | 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真〉 |
光看这张表是完全不知道该怎么操作的,我们来举个例子吧。先来判断一下我们存放脚本的目录 /root/sh/ 是否存在,命令如下:
这条命令也可以这样写:
它们的作用是一样的,推荐使用"[]"方式。因为在脚本的条件语句中主要应用这种方式。两条命令执行完后是没有任何结果的。不过要注意,如果使用"[]"方式,则在"[]"的内部和数据之间必须使用空格;否则判断式会报错。
其实 test 命令就是这样的,但是我们该如何判断这条命令的执行是否正确呢?还记得"$?"预定义变量吗?就是看这个变量的值,如果变量值为 0,则代表 test 判断为真;如果变量值非 0,则代表 test 判断为假。例如:
不过这样查看命令的结果非常麻烦,也不直观。还记得多命令顺序执行符"&&"和"||"吗?我们可以再判断一下 /root/sh/ 是否是目录,命令如下:
这样就直观多了,不过也并不方便。等我们学习了条件判断,就会知道 test 判断到底用在明哩,现在就先这样吧。
test 是非常完善的判断命令,还可以判断文件的权限,我们通过表 2 来看看。
测试选项 | 作 用 |
---|---|
-r 文件 | 判断该文件是否存在,并且是否拥有读权限(有读权限为真) |
-w 文件 | 判断该文件是否存在,并且是否拥有写权限(有写权限为真) |
-x 文件 | 判断该文件是否存在,并且是否拥有执行权限(有执行权限为真) |
-u 文件 | 判断该文件是否存在,并且是否拥有SUID权限(有SUID权限为真) |
-g 文件 | 判断该文件是否存在,并且是否拥有SG1D权限(有SGID权限为真) |
-k 文件 | 判断该文件是否存在,并且是否拥有SBIT权限(有SBIT权限为真) |
在使用 test 命令判断权限时,并不能区分所有者、属组和其他人。只要文件拥有权限,test 判断就为真,而不能区分哪个用户身份拥有权限。比如:
虽然 student.txt 文件只有所有者拥有写权限,但在用 test 判断时,是不能区分身份的,只要拥有写权限就返回真。
通过表 3 来看看如何进行两个文件之间的比较。
测试选项 | 作 用 |
---|---|
文件 1 -nt文件 2 | 判断文件1的修改时间是否比文件2的新(如果新则为真) |
文件 1 *ot文件 2 | 判断文件1的修改时间是否比文件2的旧(如果旧则为真) |
文件 1 -ef 文件 2 | 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个 判断用于判断硬链接是很好的方法 |
我们一直很苦恼,到底该如何判断两个文件是否是硬链接呢?这时 test 就派上用场了,命令如下:
通过表 4 来学习一下如何在两个整数之间进行比较。
测试选项 | 作 用 |
---|---|
整数1 -eq 整数 2 | 判断整数 1 是否和整数 2 相等(相等为真) |
整数1 -ne 整数 2 | 判断整数 1 是否和整数 2 不相等(不相等为真) |
整数1 -gt 整数 2 | 判断整数 1 是否大于整数 2 (大于为真) |
整数1 -lt 整数 2 | 判断整数 1 是否小于整数 2(小于为真) |
整数1 -ge 整数 2 | 判断整数 1 是否大于等于整数 2 (大于等于为真) |
整数1 -le 整数 2 | 判断整数 1 是否小于等于整数 2(小于等于为真) |
举个例子:
通过表 5 来学习一下字符串判断。
测试选项 | 作 用 |
---|---|
-z 字符串 | 判断字符串是否为空(为空返回真) |
-n 字符串 | 判断宇符串是否为非空(非空返回真) |
字串 1 = 字串 2 | 判断字符串 1 是否和字符串 2 相等(相等返回真) |
字串 1 != 字串 2 | 判断字符串 1 是否和字符串 2 不相等(不相等返回真) |
举个例子:
再来看看如何判断两个字符串相等,命令如下:
通过表 6 来看看多重条件判断是什么样子的。
测试选项 | 作 用 |
---|---|
判断 1 -a 判断 2 | 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真 |
判断 1 -o 判断 2 | 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真 |
! 判断 | 逻辑非,使原始的判断式取反 |
举个例子:
要想让刚刚的判断式返回真,需要给变量 aa 重新赋一个大于 23 的值,命令如下:
再来看看逻辑非是什么样子的,命令如下:
注意,"!"和"-n"之间必须加入空格,否则会报错。