shell变量命名须遵守字符规则、避免与内置变量冲突、使用大小写和前缀区分作用域,赋值无空格、引用用${}、值含空格需加双引号,并通过env/set检查、set -u和存在性判断验证。

Shell变量命名看似简单,但稍不注意就容易踩坑——尤其是和内置变量或系统环境变量重名,轻则逻辑异常,重则导致命令找不到、脚本静默失败。规范命名的核心是“可区分、不冲突、易维护”。
遵守基础字符与格式规则
变量名只能由字母(a–z、A–Z)、数字(0–9)和下划线(_)组成;必须以字母或下划线开头,不能以数字开头;不能含空格、连字符(-)、点号(.)、@、#、$、&等任何特殊符号;也不能使用Shell保留字(如if、for、then、PATH等)。
- ✅ 合法示例:
LOG_DIR、backup_count、_tmp_file - ❌ 非法示例:
1st_run(数字开头)、my-var(含连字符)、user@host(含@)、PATH(覆盖系统变量)
用大小写和前缀明确作用域与用途
约定俗成的大小写习惯能一眼识别变量性质:全大写加下划线(UPPER_CASE)专用于常量、配置项或全局环境变量;小写加下划线(snake_case)用于普通局部变量或函数内变量。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 推荐把自定义变量加上项目或功能前缀,比如
MYAPP_LOG_PATH、DISK_CHECK_INTERVAL,避免和HOME、USER、PWD等系统变量同名 - 不要直接复用
PATH、IFS、PS1、OLDPWD等内置变量名——哪怕只是临时用,也极易引发不可预知行为 - 函数内部如需同名变量,应使用
local声明,防止污染外部作用域
赋值与引用时同步规避风险
命名规范只是第一步,配合正确的赋值和引用方式才能真正防冲突:
- 赋值等号两侧**绝对不能有空格**:
CONFIG_FILE="/etc/myapp.conf"✅,CONFIG_FILE = "/etc/myapp.conf"❌(会被解释为执行命令CONFIG_FILE) - 引用变量统一用
${VAR_NAME}格式,而非$VAR_NAME——尤其在拼接路径或字符串时,能避免歧义,比如"${DATA_DIR}/logs"比"$DATA_DIR/logs"更安全 - 若变量值可能为空或含空格/特殊字符,赋值时务必用双引号包裹:
FILE_NAME="my report.txt",否则shell会将其拆分为多个参数
验证是否真的避开了冲突
写完变量后,别急着运行,快速检查三件事:
- 运行
env | grep -i "your_var_name"或set | grep "^your_var_name=",确认没意外覆盖已有变量 - 在脚本开头加
set -u(或set -o nounset),让未定义变量直接报错,而不是静默展开为空字符串 - 对关键变量做存在性判断:
[ -z "${BACKUP_DIR+set}" ] && echo "BACKUP_DIR not set" >&2 && exit 1










