linux脚本安全读取环境变量需:①用${var:?}报错、${var:-default}兜底、${var:+value}条件展开;②所有引用加双引号;③最小化继承,用env -i或unset清理;④敏感操作前校验格式;⑤自定义变量小写、按需export。

在 Linux 脚本中安全读取环境变量,核心是避免未定义变量导致的静默失败、空值误判或意外字符串拼接。关键不在于“能不能读”,而在于“读得准不准、用得稳不稳”。
检查变量是否存在且非空
直接使用 $VAR 可能返回空字符串(变量存在但为空)或空值(变量未定义),两者行为不同但脚本里常被混淆。推荐用参数扩展语法明确区分:
-
${VAR:?}:变量未设置或为空时立即报错退出,适合关键配置(如${DB_HOST:?}) -
${VAR:-default}:变量未设置或为空时使用默认值,安全兜底(如LOG_DIR=${LOG_DIR:-/tmp/logs}) -
${VAR:+value}:仅当变量已设置且非空时才展开为 value,用于条件判断
避免意外的单词拆分和路径解析
含空格、通配符或特殊字符的变量值(如 PATH="/opt/my app/bin:/usr/bin")若未加引号,会被 shell 拆成多个参数。所有引用必须加双引号:
- ✅ 正确:
echo "${HOME}/.config"、cp "${SRC_FILE}" "${DST_DIR}" - ❌ 危险:
echo $HOME/.config(若HOME为空,变成/.config)、ls $PATH(会报错或列出错误目录)
只读取需要的变量,不盲目继承
脚本默认继承父 shell 全部环境,但很多变量无关甚至有害(如 LD_PRELOAD、PS1)。如需最小化依赖:
- 用
env -i启动干净子 shell:env -i PATH="$PATH" HOME="$HOME" /bin/sh myscript.sh - 在脚本开头显式清理非必要变量:
unset $(compgen -v | grep -E '^(OLDPWD|LS_COLORS|LESS)') - 对敏感操作(如
sudo或写入关键路径)前,再次校验变量值是否符合预期格式(例如用[[ $UID =~ ^[0-9]+$ ]]验证数字)
区分环境变量与脚本局部变量
用小写字母命名自定义变量(如 config_file),避免覆盖系统大写变量(如 PATH、USER)。导出仅在必要时进行:
- 脚本内部临时计算 → 不加
export,纯局部 - 需传递给子进程(如调用的 Python 脚本)→ 显式
export MY_VAR="value" - 从环境读取但只供当前脚本用 → 直接
my_path="$PATH",不重新 export
不复杂但容易忽略











