在Linux中,test命令是“条件测试工具”,用于判断文件属性、字符串关系、数值大小等,返回值为‘0’(表示测试结果为“真”)或非‘0’(表示“假”),常与‘if’、‘while’等流程控制语句配合使用。
一、文件属性判断参数(最常用)
用于检查文件 / 目录的存在性、类型、权限、大小等,语法为 test [参数] 路径
或 [ 参数 路径 ]
([
是 test
的别名,前后需加空格)。
参数 | 功能描述 |
---|---|
-e 路径 |
检查路径是否存在(文件、目录、链接等均可) |
-f 路径 |
检查路径是否为普通文件(排除目录、设备文件、链接等) |
-d 路径 |
检查路径是否为目录 |
-r 路径 |
检查当前用户对路径是否有读权限 |
-w 路径 |
检查当前用户对路径是否有写权限 |
-x 路径 |
检查当前用户对路径是否有执行权限(对目录是 “进入权限”) |
-s 路径 |
检查文件是否存在且非空(大小 > 0 字节) |
-L 路径 |
检查路径是否为符号链接(软链接,不跟随链接指向的原始文件) |
-h 路径 |
与 -L 等价,检查是否为符号链接 |
-b 路径 |
检查路径是否为块设备文件(如硬盘、U 盘) |
-c 路径 |
检查路径是否为字符设备文件(如键盘、终端) |
-p 路径 |
检查路径是否为管道文件(用于进程间通信) |
-S 路径 |
检查路径是否为套接字文件(如网络通信的 socket 文件) |
-nt 路径1 路径2 |
检查路径 1 的修改时间是否比路径 2 更新(Newer Than) |
-ot 路径1 路径2 |
检查路径 1 的修改时间是否比路径 2 更旧(Older Than) |
-ef 路径1 路径2 |
检查路径 1 和路径 2 是否为同一文件(如硬链接、同一设备的相同 inode) |
示例:
# 检查 /etc/profile 是否为存在的普通文件且有读权限
if [ -f /etc/profile -a -r /etc/profile ]; then
echo "文件存在且可读取"
fi
# 检查 link.txt 是否为符号链接
if [ -L link.txt ]; then
echo "link.txt 是软链接"
fi
二、数值比较参数
仅支持整数比较(不支持浮点数),语法为 test 数值1 [参数] 数值2
或 [ 数值1 参数 数值2 ]
。
参数 | 功能描述 | 说明(bash 中 [[ ]] 可替代为符号) |
---|---|---|
-eq |
数值 1 等于 数值 2 | 等价于 == (仅 [[ ]] 中可用) |
-ne |
数值 1 不等于 数值 2 | 等价于 != (仅 [[ ]] 中可用) |
-gt |
数值 1 大于 数值 2 | 等价于 > (仅 [[ ]] 中可用) |
-lt |
数值 1 小于 数值 2 | 等价于 < (仅 [[ ]] 中可用) |
-ge |
数值 1 大于等于 数值 2 | 等价于 >= (仅 [[ ]] 中可用) |
-le |
数值 1 小于等于 数值 2 | 等价于 <= (仅 [[ ]] 中可用) |
⚠️ 注意:不可直接用 =
/>
等符号在 [ ]
中比较数值(会被当作字符串比较),需用上述参数。
示例:
# 比较变量 count 是否大于 10
count=15
if [ $count -gt 10 ]; then
echo "count 超过 10"
fi
# bash 扩展写法(用 [[ ]] 和 >)
if [[ $count > 10 ]]; then
echo "count 超过 10"
fi
三、字符串比较参数
用于判断字符串的空值、相等性、排序(按 ASCII 码),语法为 test "字符串1" [参数] "字符串2"
(建议加引号,避免空格解析错误)。
参数 | 功能描述 |
---|---|
= 或 == |
字符串 1 等于 字符串 2(= 是标准写法,== 优先在 [[ ]] 中使用) |
!= |
字符串 1 不等于 字符串 2 |
-z 字符串 |
检查字符串是否为空值(长度为 0) |
-n 字符串 |
检查字符串是否非空(长度 > 0,字符串必须加引号,避免空变量误判) |
> |
字符串 1 按ASCII 码排序大于字符串 2(仅 [[ ]] 或 test 中可用) |
< |
字符串 1 按ASCII 码排序小于字符串 2(仅 [[ ]] 或 test 中可用) |
⚠️ 关键:[ -z $var ]
是危险写法(若 var
未定义,会解析为 [ -z ]
,结果为 “真”),必须写成 [ -z "$var" ]
。
示例:
# 检查用户名是否为 "root"
user=$(whoami)
if [ "$user" = "root" ]; then
echo "当前是管理员用户"
fi
# 检查输入是否为空
read input
if [ -z "$input" ]; then
echo "输入不能为空"
fi
# 按 ASCII 码比较(A < a,数字 < 字母)
if [[ "Apple" < "banana" ]]; then
echo "Apple 的 ASCII 排序在 banana 之前"
fi
四、逻辑组合参数
用于组合多个条件(与 / 或 / 非),实现复杂判断,分为标准写法(兼容所有 shell)和bash 扩展写法(仅 [[ ]]
支持)。
逻辑关系 | 标准写法(test /[ ] ) |
bash 扩展写法([[ ]] ) |
说明 | ||
---|---|---|---|---|---|
逻辑与 | -a (参数) 或 \&& (转义) |
&& |
所有条件为真,结果才为真 | ||
逻辑或 | -o (参数) 或 || (转义) |
` | ` | 任意条件为真,结果为真 | |
逻辑非 | ! 条件 |
! 条件 |
反转条件结果(真→假,假→真) |
示例:
# 标准写法:逻辑与(-a)+ 逻辑非(!)
file="/tmp/log.txt"
if [ ! -f "$file" -a ! -d "$file" ]; then
echo "路径 $file 既不是文件也不是目录"
fi
# bash 扩展写法:逻辑或(||)+ 短路逻辑
age=22
if [[ $age -ge 18 || $age -le 6 ]]; then
echo "年龄符合特殊条件" # 满足一个条件即可,无需判断另一个
fi
五、核心语法与注意事项
两种等价语法:
- 标准:
test 条件
→ 例:test -f file.txt
- 精简:
[ 条件 ]
→ 例:[ -f file.txt ]
([
后和]
前必须加空格) - 扩展:
[[ 条件 ]]
(bash 专属,支持&&
/||
/ 模式匹配,无需转义)
- 标准:
退出状态码:
- 执行
test
后,用echo $?
查看结果:0 表示 “真”,1 表示 “假”。 - 示例:
[ -e /etc/passwd ]; echo $?
→ 输出 0(文件存在)。
- 执行
常见误区:
- 变量不加引号:
[ $name = "Alice" ]
若name
含空格(如Bob Smith
),会拆分为多个参数,导致语法错误,需写成[ "$name" = "Alice" ]
。 - 浮点数比较:
test
不支持,需用bc
工具(如echo "3.14 > 2.71" | bc
,输出 1 为真)。 - 符号链接判断:
-f
/-d
会跟随链接,若需判断链接本身,需用-L
。
- 变量不加引号:
通过上述参数,test
可覆盖 Linux 中绝大多数条件判断场景,是编写 shell 脚本(如自动化部署、日志分析)的核心工具,掌握其参数用法是实现脚本逻辑的基础。