当前位置: 首页 > news >正文

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 ]; thenecho "文件存在且可读取"
fi# 检查 link.txt 是否为符号链接
if [ -L link.txt ]; thenecho "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 ]; thenecho "count 超过 10"
fi# bash 扩展写法(用 [[ ]] 和 >)
if [[ $count > 10 ]]; thenecho "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" ]; thenecho "当前是管理员用户"
fi# 检查输入是否为空
read input
if [ -z "$input" ]; thenecho "输入不能为空"
fi# 按 ASCII 码比较(A < a,数字 < 字母)
if [[ "Apple" < "banana" ]]; thenecho "Apple 的 ASCII 排序在 banana 之前"
fi

四、逻辑组合参数

用于组合多个条件(与 / 或 / 非),实现复杂判断,分为标准写法(兼容所有 shell)和bash 扩展写法(仅 [[ ]] 支持)。

逻辑关系标准写法(test/[ ]bash 扩展写法([[ ]]说明
逻辑与-a(参数) 或 \&&(转义)&&所有条件为真,结果才为真
逻辑或-o(参数) 或 ||(转义)``任意条件为真,结果为真
逻辑非! 条件! 条件反转条件结果(真→假,假→真)

示例

# 标准写法:逻辑与(-a)+ 逻辑非(!)
file="/tmp/log.txt"
if [ ! -f "$file" -a ! -d "$file" ]; thenecho "路径 $file 既不是文件也不是目录"
fi# bash 扩展写法:逻辑或(||)+ 短路逻辑
age=22
if [[ $age -ge 18 || $age -le 6 ]]; thenecho "年龄符合特殊条件"  # 满足一个条件即可,无需判断另一个
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 脚本(如自动化部署、日志分析)的核心工具,掌握其参数用法是实现脚本逻辑的基础。

http://www.xdnf.cn/news/1445203.html

相关文章:

  • Kotlin编程学习记录2
  • Linux `epoll` 机制的入口——`epoll_create`函数
  • 自由学习记录(92)
  • 图像正向扭曲反向扭曲
  • 关于缓存的一些思考?
  • 从Java全栈到前端框架:一次真实的面试对话
  • 自动化运维-ansible中对于大项目的管理
  • HTML第八课:HTML4和HTML5的区别
  • 网络通信与协议栈 -- OSI,TCP/IP模型,协议族,UDP编程
  • Linux 网络编程中核心函数`recv`。
  • Qt6用Chart模块做数据可视化?别再用老套路,看看这套35张图背后的秘密
  • MySQL :索引原理
  • 【面试题】BPE和WordPiece的区别?
  • Anaconda3出现Fatal error in launcher: Unable to create process using.....问题
  • STM32CubeMX + HAL 库:基于 I²C 通信的 BMP280气压海拔测量
  • 【超详细】别再看零散的教程了!一篇搞定Gitee从注册、配置到代码上传与管理(内含避坑指南最佳实践)
  • PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
  • Wan系列模型解析--详细架构图
  • 机器学习在Backtrader多因子模型中的应用
  • 美团龙猫利用expat库实现的保存xml指定范围数据到csv的C程序
  • TypeScript 泛型入门(新手友好、完整详解)
  • XSENS VISION NAVIGATOR助力智能城市自动化清洁机器人精确导航
  • TLSF内存算法适配HTOS
  • 【Unity UGUI Canvas(画布)(1)】
  • 【音视频】FMP4 介绍
  • 【正点原子K210连载】第三十一章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 【论文阅读】-《THE JPEG STILL PICTURE COMPRESSION STANDARD》
  • Android 接入deepseek
  • 关于ES中文分词器analysis-ik快速安装
  • k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)