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=34.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 settings4.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 -f4.6 尝试修改只读变量(错误示例)
演示修改或取消只读变量会引发的错误。
bash
运行
readonly SITE="example.com" SITE="newexample.com" # 错误:-bash: SITE: readonly variable unset SITE # 错误:-bash: unset: SITE: cannot unset: readonly variable5. 注意事项
- 永久性设置: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 手册。