readonly 是 bash 内建命令,用于将变量或函数标记为只读,赋值后不可修改或删除;必须在赋值时或赋值后立即使用 readonly 命令锁定,支持一步声明(如 readonly var=value)或分步设置,配合 -a、-a、-f 分别锁定数组和函数,readonly -p 可查看全部只读项。

在 Linux Shell 中,用 readonly 命令标记变量为只读,是最直接、内建且无需额外工具的防误改方式。它不是语法修饰词,而是 Bash 内建命令,作用于变量本身——一旦设置,任何赋值或 unset 操作都会被拒绝。
怎么正确设置才真正生效
关键在于:必须在变量有值之后、或赋值的同时加 readonly,否则变量仍可修改。
- 推荐写法:声明即锁定,一步到位
readonly DB_HOST="10.0.1.5" API_TIMEOUT=30 - 已有变量可补锁:
CONFIG_PATH="/etc/app.conf"<br>readonly CONFIG_PATH
- 注意:不能写
readonly $varname—— 必须写变量名本身,如readonly CONFIG_PATH
哪些变量适合设为只读
重点保护脚本中参与逻辑、但不该被覆盖的常量或敏感配置:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 硬编码的服务地址、端口、超时值等:
readonly APP_ENV="prod" LOG_LEVEL="warn" - 临时会话中的凭证(不建议明文存长期):
readonly SECRET_KEY="$KEY_FROM_VAULT" - 系统级变量(如
BASH_VERSION)已自动只读,无需重复操作
如何验证和排查是否真的锁住了
避免“以为锁了,其实没锁”的疏漏:
- 查看所有只读项:
readonly -p(输出形如declare -r DB_HOST="10.0.1.5") - 检查单个变量:
declare -p DB_HOST 2>/dev/null | grep -q '^declare -r',返回 0 表示已锁定 - 尝试修改时会报错:
-bash: DB_HOST: readonly variable—— 这是正常拦截,说明生效了 - 同样,
unset DB_HOST也会失败,提示cannot unset: readonly variable
要注意的限制和边界
readonly 不是万能锁,需清楚它的作用范围:
- 只对当前 shell 进程及其子 shell 生效;父进程或其他终端会话完全不受影响
- 无法撤销:没有
readonly -u或declare +r这类“解锁”机制;只能退出当前 shell 或重启会话 - 数组和关联数组需显式指定:
readonly -a myarr=(a b c)或readonly -A conf=(["host"]="x") - 函数也可锁定:
myfunc() { echo "ok"; }; readonly -f myfunc,防止函数体被重定义










