在 macOS Shell 脚本中读取自定义环境变量需确保变量已 export 导出;应写入 ~/.zshrc 并 source 生效,脚本中可直接使用 $VAR;若未导出或执行方式为 source,则行为不同。
在 macos 的 shell 脚本中读取自定义环境变量,关键在于确保该变量已正确导出(export)且作用域覆盖到脚本执行时的 shell 进程。
确认变量是否已导出并生效
Shell 脚本默认只能访问 导出过的环境变量(即通过 export VAR=value 设置的),普通 Shell 变量(如 VAR=value)不会传递给子进程(包括脚本)。可这样验证:
- 在终端运行
echo $MY_VAR—— 若有输出,说明当前 Shell 中已定义; - 再运行
env | grep MY_VAR—— 若无输出,说明未导出,脚本里将读不到; - 补上
export MY_VAR后重试env | grep MY_VAR,应能看见结果。
让自定义变量在脚本中始终可用
推荐把变量定义和导出写入 Shell 配置文件,确保每次新终端或子 Shell 启动时自动加载:
- macOS Catalina 及以后默认用
zsh,编辑~/.zshrc(不是~/.bash_profile); - 添加一行:
export MY_API_KEY="abc123"; - 保存后运行
source ~/.zshrc或新开终端使配置生效; - 之后任何 Shell 脚本(如
./myscript.sh)都能直接用$MY_API_KEY。
脚本内临时读取或覆盖变量
如果不想改全局配置,也可以在脚本开头显式导入或设置:
- 在脚本第一行加:
source ~/.zshrc(不推荐,耦合高且可能报错); - 更稳妥的做法:用
export在脚本中重新设值,例如:export MY_VAR=${MY_VAR:-"fallback_value"}; - 或者从外部文件加载:
source ./env.conf(需确保env.conf里含export MY_VAR=...)。
注意 Shell 类型与执行方式的影响
脚本能否读到变量,还取决于它如何被调用:
- 用
./script.sh执行 → 启动新子 Shell,只继承已导出的环境变量; - 用
source script.sh或. script.sh→ 在当前 Shell 中执行,能访问所有变量(含未导出的); - 如果脚本开头写了
#!/bin/bash,但系统默认是 zsh,变量仍以 bash 环境为准 —— 此时建议统一用#!/bin/zsh或确保变量也在 bash 配置中定义。


















