test 是 Linux 和 Unix 系统中一个用于评估条件表达式的核心命令,在 Shell 脚本编程中不可或缺。它不产生直接输出,而是通过**退出状态码(**Exit Status ) 来悄无声息地告诉你结果是"真"还是"假",脚本的核心逻辑(if, while, until)都依赖于此。
💡 最简洁:命令行直接测试
在 -a 和 -o 等逻辑运算符被建议避免使用的情况下,最推荐的方式是使用 Shell 的 && (逻辑与) 和 || (逻辑或) 操作符:
bash
#标准写法:使用\&\&进行逻辑与
[ -d /etc ] && echo "/etc 是一个目录"
#标准写法:使用\|\|进行逻辑或
[ -f /etc/passwd ] || echo "/etc/passwd 不是一个普通文件"
你还可以立即通过 $? 变量查看刚才命令的退出码,其中 0 表示"真",1 表示"假":
bash
#测试0是否等于0,结果为真
test 0 -eq 0; echo $?
#输出0
#测试文件是否存在,结果为假
test -e /path/to/nonexistent_file; echo $?
#输出1
⚙️ 核心功能分类
test 能测试文件属性、字符串和数值,其丰富选项是强大功能的核心。
1. 文件测试
这些选项用于检查文件的存在性、类型和权限。
| 选项 | 说明 |
|---|---|
| -e FILE | 文件存在。 |
| -f FILE | 存在且为普通文件。 |
| -d FILE | 存在且为目录。 |
| -L FILE / -h FILE | 存在且为软链接。 |
| -s FILE | 存在且大小非 0 (非空)。 |
| -r FILE / -w FILE / -x FILE | 存在且可读 /可写 /可执行。 |
| FILE1 -nt FILE2 | FILE1 比 FILE2 新 (修改时间)。 |
| FILE1 -ot FILE2 | FILE1 比 FILE2 旧。 |
2. 字符串测试
用于比较字符串内容或检查其是否为空。
| 运算符 | 说明 |
|---|---|
| -z STRING | STRING 的长度为零 (空字符串)。 |
| -n STRING | STRING 的长度非零 (非空字符串)。 |
| STRING1 = STRING2 | STRING1 等于 STRING2。 |
| STRING1 != STRING2 | STRING1 不等于 STRING2。 |
| STRING1 < STRING2 / STRING1 > STRING2 | 按字典序比较(在 [ ] 中需用 < > 转义)。 |