Linux变量作用域由export决定:export声明的环境变量可被子进程继承,如PATH;未export的为局部变量,仅限当前Shell使用;脚本中应按需导出,并用unset清理。

Linux 中变量的作用域完全由是否 导出(export) 决定,而不是靠“全局/局部”字面理解。脚本里用错变量,往往不是语法写错了,而是没想清楚它在哪个进程里存在、能不能被子命令或后续脚本看到。
环境变量:能被子进程继承的变量
用 export 声明的变量才是真正的环境变量。它会复制一份给所有从当前 Shell 派生出的子进程,比如你运行的命令、启动的脚本、后台任务都拿得到。
- 定义并导出:
export MY_PATH="/opt/mytools" - 验证是否生效:
printenv MY_PATH或env | grep MY_PATH - 在子脚本中可直接读取:
echo $MY_PATH(无需再 export) - 常见用途:PATH、JAVA_HOME、LD_LIBRARY_PATH 等需要被编译器、JVM、动态链接器读取的路径类变量,必须 export
局部变量:只属于当前 Shell 进程
不加 export 的赋值,只是当前 Shell 进程内部的一个普通变量,连 fork 出去的子 Shell 都看不见它。
- 定义局部变量:
tmp_dir="/tmp/build"(注意等号两边不能有空格) - 它只能在当前脚本或交互式 Shell 中用:
echo $tmp_dir - 执行另一个脚本时,该脚本读不到这个变量:
./other.sh中echo $tmp_dir输出为空 - 适合临时计算、循环计数、中间路径拼接等仅限当前上下文使用的值
脚本中控制作用域的关键实践
写脚本时,别默认全 export。要根据变量用途决定是否让它“走出去”。
- 只在当前脚本内用的配置项(如日志文件名、临时缓存路径),定义为局部变量即可
- 需要被调用的外部命令感知的(如让 gcc 找到头文件),必须 export,并确保 PATH、C_INCLUDE_PATH 等系统级变量已正确拼接
- 避免污染全局环境:脚本退出前用
unset VAR_NAME清理自定义环境变量,尤其在 sourced 脚本中 - 函数内部定义的变量默认是局部的;若需在函数外访问,需显式声明
local VAR(Bash)或直接赋值(但不 export)
验证变量是否真的“传下去”了
别只靠 echo $VAR 看当前值。真正要确认作用域,得测子进程:
- 测试环境变量是否导出:
bash -c 'echo $MY_PATH'—— 如果有输出,说明已 export 成功 - 测试局部变量是否隔离:
bash -c 'echo $tmp_dir'—— 应该什么也不输出 - 检查某个变量是否在环境里:
env | grep "^MY_PATH="(加 ^ 和 = 可排除别名或子串误匹配)


















