readonly 是最可靠轻量的变量只读设置方式,可阻止脚本自身误改、函数覆盖或 sourced 文件干扰;支持赋值同时设只读、对已有变量补加、批量声明及验证排查。

直接用 readonly 命令设置变量为只读,是最可靠、最轻量的方式。它能有效阻止后续任何赋值操作,包括脚本自身误改、函数内覆盖或 sourced 文件的干扰。
基础写法:赋值同时设只读
推荐在定义关键变量(比如配置路径、安装根目录)时一步到位:
readonly APP_HOME="/opt/myapp"readonly LOG_DIR="${APP_HOME}/logs"readonly CONFIG_FILE="${APP_HOME}/conf/app.conf"
这样既避免了中间状态(先赋值再设只读),也防止变量名拼写错误导致重复定义漏保护。
对已有变量补加只读属性
如果变量已在别处定义(如 source 了一个配置文件),可用 readonly 单独加固:
source ./env.sh # 其中定义了 BIN_PATHreadonly BIN_PATH
注意:不带等号,也不写 =;写成 readonly BIN_PATH=xxx 会重新赋值并设只读,可能覆盖原值。
批量保护多个路径变量
当涉及一组相关路径时,可一次声明多个,提升可读性和执行效率:
readonly ETCD_BIN="/usr/local/bin/etcd" \ ETCD_CONF="/etc/etcd/etcd.conf" \ ETCD_DATA="/var/lib/etcd"
换行用反斜杠续行,所有变量都会被标记为只读,且 shell 会按顺序处理,无先后依赖问题。
验证和排查只读状态
运行中想确认某个路径变量是否已生效保护,可以用:
-
readonly | grep -E '^(ETCD|APP|LOG)_'—— 查看匹配的只读变量 -
readonly -p | grep CONFIG_FILE—— 精确显示该变量定义(含值)
若尝试修改,bash 会立即报错:bash: APP_HOME: readonly variable,不会静默失败,便于快速定位问题脚本段。











