test命令与参数

在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

五、核心语法与注意事项

  1. 两种等价语法

    • 标准:test 条件 → 例:test -f file.txt
    • 精简:[ 条件 ] → 例:[ -f file.txt ][ 后和 ] 前必须加空格)
    • 扩展:[[ 条件 ]](bash 专属,支持 &&/||/ 模式匹配,无需转义)
  2. 退出状态码

    • 执行 test 后,用 echo $? 查看结果:0 表示 "真",1 表示 "假"。
    • 示例:[ -e /etc/passwd ]; echo $? → 输出 0(文件存在)。
  3. 常见误区

    • 变量不加引号:[ $name = "Alice" ]name 含空格(如 Bob Smith),会拆分为多个参数,导致语法错误,需写成 [ "$name" = "Alice" ]
    • 浮点数比较:test 不支持,需用 bc 工具(如 echo "3.14 > 2.71" | bc,输出 1 为真)。
    • 符号链接判断:-f/-d 会跟随链接,若需判断链接本身,需用 -L

通过上述参数,test 可覆盖 Linux 中绝大多数条件判断场景,是编写 shell 脚本(如自动化部署、日志分析)的核心工具,掌握其参数用法是实现脚本逻辑的基础。

相关推荐
耳总是一颗苹果5 小时前
数据结构---选择排序
c语言·数据结构·学习·算法·排序算法
战术摸鱼大师5 小时前
电机控制(一)-电机分类
算法·运动控制·电机控制
肾透侧视攻城狮8 小时前
从淘宝推荐到微信搜索:查找算法如何支撑亿级用户——动画可视化
算法·微信
楼田莉子8 小时前
C++算法专题学习:模拟算法
开发语言·c++·学习·算法·leetcode
苏言の狗8 小时前
A*(Astar)算法详解与应用
c语言·c++·算法
李铁柱的9 小时前
数值分析——误差的来源与分类、误差的基本概念(绝对误差、相对误差、有效数字)
人工智能·算法·分类·数据挖掘
蒹葭玉树9 小时前
【C++上岸】C++常见面试题目--算法篇(第十八期)
c++·算法·面试
EkihzniY9 小时前
OCR 发票识别与验真接口:助力电子化发票新时代
算法
一支鱼10 小时前
leetcode-5-最长回文子串
算法·leetcode·typescript