Linux 命令大全:readonly 命令详解 —— Bash 只读变量与只读函数完全指南
发布时间:2026/10/3 20:15:35 锦皓数字建站

文档教程【免费下载链接】linux-commandLinux命令大全搜索工具内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux项目地址https://gitcode.com/GitHub_Trending/linux/linux-command点击查看免费下载readonly是 Bash 内建命令用于将 shell 变量或函数标记为只读一旦设置便无法修改值、无法删除也无法撤销该属性。本文以 linux-command 仓库中 command/readonly.md 为核心骨架结合仓库内declare、unset、local、export等兄弟命令文档系统讲解其语法、选项、实战用法与底层属性机制帮助你在脚本开发中正确使用只读保护。readonly 是什么Bash 内建的属性设置命令readonly并不是独立的可执行程序而是 Bash 自带的内建命令builtin。它做的事情本质上是给「变量」或「函数」附加一个只读属性readonly attribute使其状态被冻结变量被标记为只读后其值不可再被修改也不能被unset删除函数被标记为只读后其函数体定义不可再被重新定义。在 linux-command 仓库中该命令的手册文档位于 command/readonly.md与declare、export、local、unset等文档同属于「Bash 内建命令」系列共同构成一套完整的变量属性操作体系。整个仓库按 README.md 所述搜集了 600 多个 Linux 命令的速查手册本篇文章正是对其中readonly一章的展开讲解。主要用途根据 command/readonly.mdreadonly命令覆盖五类核心用途定义一到多个变量并直接设置只读属性为已定义的一到多个变量补设只读属性显示全部包含只读属性的变量为已定义的一到多个函数设置只读属性显示全部包含只读属性的函数。语法与选项语法readonly [-aAf] [name[value] ...] readonly -p第一种形式定义/标记变量或函数第二种形式显示全部只读变量。选项选项说明-a指向数组array。设置属性时按普通数组处理配合-p查看时仅显示只读数组-A指向关联数组associative array仅在 Bash 4.0 支持-f指向函数。为函数设置只读属性或仅显示只读函数-p显示全部只读变量以declare -r形式输出--结束选项解析在它之后的参数一律按名称处理参数参数说明name可选变量名或函数名可同时指定多个value可选变量的初始值仅在定义时随namevalue一并给出返回值readonly返回true退出码 0除非你提供了非法选项或非法名称。快速查看帮助由于是 Bash 内建命令其帮助信息可通过help命令查看help的用法见 command/help.mdhelp readonly也可以用type -t readonly确认其类型返回结果为builtintype命令的用法见 command/type.md。实战一定义变量的同时设置只读属性最直接的使用方式是在定义时一步完成「声明 只读 赋值」# 定义两个变量var1 赋值为 13var2 仅声明值为空两者均为只读 readonly var113 var2 # 定义只读普通数组 readonly -a arr1(1 2 3 4 5) arr2(z x c) # 定义只读关联数组必须使用 -A 选项 readonly -A dict1([key1]value1)几点注意事项关联数组必须带-A选项才能正确定义否则 Bash 会按普通数组解析([key1]value1)并报错var2虽然未赋值但一旦被标记为只读之后任何赋值操作都会被拒绝。实战二为已存在的变量与函数补设只读属性也可以先正常定义变量/函数之后再追加只读属性。关键在于选项的取舍# 先定义变量再为其添加只读属性 max3 readonly max # 数组定义时可以不加 declare -a直接字面量定义即为数组 seasons(spring summer autumn winter) # 为数组添加只读属性时可以省略 -a 选项 readonly seasons # 关联数组需要用 declare -A 显式声明 declare -A man([age]23 [height]190cm) # 为关联数组添加只读属性时可以省略 -A 选项 readonly man # 先定义函数再为函数添加只读属性 function foo(){ echo bar; } # 注意为函数添加只读属性时必须加 -f 选项 readonly -f foo这里有一个容易混淆的规则为数组补设只读属性时-a/-A可以省略因为变量本身已经是数组类型而为函数补设只读属性时-f不能省略否则 Bash 会把函数名当作变量名处理。被readonly -f标记后的函数后续重新定义会直接报错例如function foo(){ echo bar; } readonly -f foo function foo(){ echo baz; } # bash: foo: readonly function实战三查看只读变量与函数不带任何参数的readonly会列出当前 shell 中全部只读变量与readonly -p输出结果一致# 显示全部只读变量以下两个命令的显示结果一样 readonly readonly -p # 显示全部拥有只读属性的数组 readonly -a # 显示全部拥有只读属性的关联数组 readonly -A # 显示全部拥有只读属性的函数 readonly -f输出格式以declare -r开头例如declare -r var113 declare -r max3这与export -p输出以declare -x开头是同一套「属性描述」机制可参考 command/export.md 中export命令的扩展阅读示例对照理解只读、导出、整型、大小写等属性最终都由declare体系统一描述。常见错误修改只读变量立即报错对于只读变量任何修改值的尝试都会立即失败。例如定义一个只读变量test并初始化为ok[rootlocalhost ~]# readonly testok # 定义只读变量并初始化随后试图修改它的值[rootlocalhost ~]# testmy # 试图修改只读变量的值 -bash: test: readonly variableBash 会直接拒绝赋值并给出readonly variable的报错提示。同理尝试删除只读变量同样会失败[rootlocalhost ~]# unset test -bash: unset: test: cannot unset: readonly variable深入原理为什么只读属性撤不掉这是readonly最容易踩坑的地方只读属性是单向、不可逆的。原文档 command/readonly.md 的「注意」一节明确指出了两条铁律declare r不能去除只读属性unset不能删除只读变量。这两条规则在仓库的兄弟命令文档中也能找到相互印证command/declare.md 中declare的选项表说明-r用于「增加只读属性」同时在其例子中特别注明「不能使用a或A取消数组也不能使用r取消只读属性」并演示了declare -ar season(Spring Summer Autumn Winter)这种「定义只读数组」的等价写法command/unset.md 的返回值说明明确指出unset「返回成功除非选项错误或要删除的变量或函数有只读属性」即只读变量不在可删除范围内。从实现机制上看只读属性被 Bash 视为变量/函数的「永久性约束」一旦设置就写入了该名称的不可变更状态因此没有任何内建手段可以安全地解除它——这也是它被用于保护关键配置的根本原因。与相关内建命令的联动属性家族readonly并非孤立存在它与declare、export、local共享同一套「变量属性」机制理解它们的关系才能用好只读属性命令与 readonly 的关系declare -r与readonly等价均为变量增加只读属性两者可互换使用export为变量/函数增加导出属性进入子进程环境与只读属性相互独立、可叠加local -r在函数内部定义只读局部变量函数退出后自动销毁unset无法删除只读变量/函数会返回失败在函数内使用只读变量local命令的选项与declare完全相同见 command/local.md因此函数内声明只读局部变量的推荐写法是function init() { local -r MAX_RETRY5 # 只读局部变量函数结束即销毁 local -a readonly_arr() # 配合数组使用 echo ${MAX_RETRY} }只读 ≠ 导出值得特别提醒的是只读属性与导出属性是两回事。readonly var1只冻结变量本身并不会让变量出现在子进程环境中如果需要既保护又传递应叠加使用readonly CONFIG_HOME/etc/my-app export CONFIG_HOME关于导出属性的完整语义环境变量继承、子进程可见性等可进一步阅读 command/export.md。脚本实战建议用只读属性保护关键常量在实际的 Shell 脚本开发中readonly最常见的价值是冻结关键配置与常量防止脚本运行过程中被误改#!/usr/bin/env bash # 配置文件常量初始化后不可再被修改 readonly APP_NAMEmy-service readonly APP_VERSION2.3.0 readonly CONFIG_DIR/etc/my-service readonly DEFAULT_TIMEOUT30 # 将已加载的配置项追加标记为只读 load_config() { . /etc/my-service/env.sh readonly DB_HOST DB_PORT DB_USER }使用时的三条经验准则来自对原文档与兄弟命令文档的归纳定义时直接加只读readonly varvalue一步到位语义最清晰函数用local -r在函数内定义的临时常量优先使用local -r避免污染全局命名空间command/declare.md 的「讨论」章节专门强调了全局变量被意外修改的风险批量冻结对脚本启动时从配置文件加载的一批变量可用readonly NAME1 NAME2 ...一次性补设只读属性。小结要点结论命令类型Bash 内建命令builtin帮助信息用help readonly查看语法readonly [-aAf] [name[value] ...]/readonly -p数组-a普通数组、-A关联数组补设属性时可省略函数必须使用-f值修改立即报错readonly variable属性撤销不可逆declare r无效变量删除不可行unset失败readonly虽然语法简单但其「不可逆」特性决定了它是一把双刃剑合理使用可以显著提升脚本的健壮性与可维护性滥用则可能导致配置无法调整。建议结合 command/readonly.md 原文以及 command/declare.md、command/unset.md、command/export.md、command/local.md 等兄弟文档系统掌握 Bash 变量属性体系的整体脉络。赞分享文档教程【免费下载链接】linux-commandLinux命令大全搜索工具内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux项目地址https://gitcode.com/GitHub_Trending/linux/linux-command点击查看免费下载相关推荐Jspreadsheet 只读单元格与只读列完整指南数据保护与 readOnly 配置详解Jspreadsheet 只读单元格与只读列完整指南数据保护与 readOnly 配置详解 导读 本篇指南聚焦 Jspreadsheet当前仓库为 Jspr前端UI组件ClaudeComputerCommander 计算机健康检查Linux 只读诊断命令集与解读指南ClaudeComputerCommander 计算机健康检查Linux 只读诊断命令集与解读指南 导读 本文讲解 ClaudeComputerCommand人工智能MCP 服务AI Agent开发工具The Concise TypeScript Book 精读readonly 只读属性完全指南The Concise TypeScript Book 精读 readonly 只读属性完全指南 本篇技术指南围绕开源项目 typescript book h文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。