Linux readonly 命令详解|Shell 变量 / 函数设为只读,防止误改全攻略

📅 2026/8/4 4:03:56 👁️ 阅读次数 📝 编程学习
Linux readonly 命令详解|Shell 变量 / 函数设为只读,防止误改全攻略

1. 命令简介

readonly 是 Bash 和其他兼容 Shell 的内建命令,用于将 Shell 变量或函数标记为只读。一旦变量或函数被设置为只读,其值或定义就不能被修改或取消设置(unset),这有助于保护重要的配置或防止意外更改。


2. 语法格式

bash

运行

readonly [-aAf] [-p] [name[=value] ...]

语法说明

  • 直接定义并设置为只读:readonly [选项] name[=value] ...
  • 将已存在的变量 / 函数设为只读:readonly [选项] name ...
  • 显示已设置的只读项:readonly [-p]readonly(无参数)

3. 常用选项及说明

表格

选项说明
-a指定后面的 name 为索引数组(array)。在定义数组并设为只读时使用。
-A指定后面的 name 为关联数组(associative array)。在定义关联数组并设为只读时使用。
-f指定后面的 name 为函数(function)。为函数设置只读属性时必须使用此选项。
-p显示当前 Shell 环境中所有已设置的只读变量。如果不提供 name 参数,默认行为就是 -p。
--表示选项结束,其后所有参数均视为 name,即使它们以 - 开头。

参数说明

  • name(可选):要设置为只读的变量名或函数名。
  • value(可选):在定义变量时直接赋予的初始值。对于数组,值应为括号括起的列表。

返回值

  • 成功时返回 0(true)。
  • 如果提供了非法选项、非法名称(如无效的变量名)或尝试修改只读变量,则返回非零值(false)。

4. 示例用法

4.1 定义变量并立即设为只读

定义单个或多个只读变量。

bash

运行

# 定义单个只读变量 readonly PI=3.14159 # 定义多个只读变量 readonly APP_NAME="MyApp" VERSION="1.0" MAX_RETRIES=3

4.2 定义数组并设为只读

定义并设置只读的索引数组或关联数组。

bash

运行

# 定义并设置只读索引数组 readonly -a COLORS=("red" "green" "blue") # 定义并设置只读关联数组 readonly -A CONFIG=(["host"]="localhost" ["port"]="8080")

4.3 将已存在的变量设为只读

先定义普通变量或数组,再将其设为只读。

bash

运行

# 先定义变量 path="/usr/local/bin" count=10 declare -a files=("a.txt" "b.txt") declare -A settings=(["mode"]="debug") # 再将它们设为只读(注意:数组可省略 -a/-A) readonly path count files settings

4.4 将函数设为只读

定义函数后,必须使用 -f 选项将其设为只读。

bash

运行

# 先定义函数 log_message() { echo "[$(date)] $1" } # 将函数设为只读(必须使用 -f) readonly -f log_message # 此后尝试重新定义 log_message 会失败

4.5 显示只读变量和函数

查看当前 Shell 中已设置的只读项。

bash

运行

# 显示所有只读变量(两种方式等效) readonly readonly -p # 显示所有只读索引数组 readonly -a # 显示所有只读关联数组 readonly -A # 显示所有只读函数 readonly -f

4.6 尝试修改只读变量(错误示例)

演示修改或取消只读变量会引发的错误。

bash

运行

readonly SITE="example.com" SITE="newexample.com" # 错误:-bash: SITE: readonly variable unset SITE # 错误:-bash: unset: SITE: cannot unset: readonly variable

5. 注意事项

  • 永久性设置:readonly 属性在当前 Shell 会话中持续有效,且无法撤销。无法使用 declare +r 或 unset 移除只读属性或删除只读变量。
  • 子 Shell 继承:通过 export 导出的只读变量会传递给子进程(子 Shell),且在子 Shell 中同样为只读。
  • 函数只读限制:函数设为只读后,不能重新定义或取消定义,但函数内部的逻辑(如访问全局变量)不受只读属性限制。
  • 数组定义语法:使用 readonly -a 或 readonly -A 定义数组时,赋值语法必须正确(如 arr=(value1 value2))。
  • 脚本使用建议:在 Shell 脚本中,建议将重要的配置变量(如路径、常量)设为只读,以提高脚本的健壮性。
  • 检查只读状态:可通过 declare -p variable_name 查看变量属性,输出中包含 -r 则表示只读。

相关命令

  • declare /typeset:更通用的变量属性设置命令,也可设置只读属性(如 declare -r VAR=value)。
  • export:设置环境变量,常与 readonly 结合使用(如 export readonly DATABASE_URL)。

本命令是 Shell 内建命令,更多细节请参考 help readonly 或 Shell 手册。