shell脚本只能读取已导出的环境变量,如pwd、home、user、path等系统变量或用export设置的变量;局部变量var=value不可被继承;引用时用$var或${var},注意大小写、执行方式及非交互环境的变量加载问题。

在 Shell 脚本中读取环境变量非常直接——只要该变量已存在于当前 shell 环境中(即已导出为环境变量),脚本就能直接引用它,无需额外加载。
哪些环境变量能被脚本自动读取
只有已导出的全局环境变量才能被子进程(包括执行中的 Shell 脚本)继承并读取。例如:
-
PWD、HOME、USER、PATH这类系统预设变量,默认已导出,脚本可直接使用 - 你自己用
export VAR=value设置的变量,也会被子脚本继承 - 仅用
VAR=value定义的局部变量,不会传入脚本,脚本里读不到
在脚本中读取的写法
语法统一:用 $变量名 或更安全的 ${变量名}(尤其拼接字符串时推荐):
-
echo $HOME→ 输出用户主目录路径 echo "当前用户:${USER},家目录:${HOME}"-
if [ -n "$MY_API_KEY" ]; then ... fi→ 判断自定义环境变量是否存在
常见读取失败原因和应对
脚本运行后显示空值或报错,通常是因为:
- 变量未导出:在运行脚本前,确认执行过
export MY_VAR=value - 脚本以
sh script.sh方式运行:可能启动的是 POSIX sh,不继承当前 bash 的所有环境;建议改用./script.sh(需有执行权限)或显式指定bash script.sh - 变量名大小写错误:Linux 区分大小写,
$Path≠$PATH - 在非登录/非交互式环境中运行(如 cron):这些环境默认只加载极简变量,需在脚本开头手动
source /etc/profile或source ~/.bashrc(谨慎使用,注意路径和权限)
验证变量是否可用的小技巧
在脚本开头加一行调试语句,快速确认:
echo "DEBUG: MY_VAR = [$MY_VAR]"- 或用
printenv | grep MY_VAR查看当前环境里有没有它 - 也可在脚本中临时运行
env | head -10浏览前 10 个环境变量











