You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本三类变量的官方术语及本质差异咨询

Bash Shell变量的官方术语与区分标准

一、官方术语及核心区分维度

Bash官方文档中,变量主要从作用域和是否传递给子进程两个维度分类,对应你提到的三类场景,官方术语和区分标准如下:

1. 环境变量(Environment Variables)

  • 对应你定义的「全局环境变量」
  • 定义方式:通过export 变量名=值声明,或先定义变量再用export 变量名导出
  • 核心特征:会被传递给当前Shell的所有子进程(包括子Shell),当前Shell、脚本全局、子Shell/子进程均能访问;可通过printenv或env命令查看。

2. 全局Shell变量(Global Shell Variables)

  • 对应你定义的「全局变量」
  • 定义方式:在脚本顶层(函数外部)直接赋值,未执行export操作
  • 核心特征:作用域仅限于当前Shell会话/脚本全局,不会自动传递给子Shell;仅能通过set命令查看(set会列出所有Shell变量,包括环境变量)。

3. 局部Shell变量(Local Shell Variables)

  • 对应你定义的「局部变量」
  • 定义方式:在函数内部通过local 变量名=值声明
  • 核心特征:作用域严格限制在定义它的函数及其内部嵌套函数(未被重新定义的情况下),函数外部无法访问;同样仅能通过set命令查看(仅在函数执行时存在)。

关于术语混用的说明:部分人将「未导出的变量」统称为局部变量,这是混淆了传递性和作用域两个维度。官方的核心区分逻辑是:

  • 按传递性:环境变量(可传递给子进程) vs 非环境变量(不可传递)
  • 按作用域:全局(脚本/Shell顶层) vs 局部(函数内部)

二、示例中var1与var2的底层区别

先明确示例的执行逻辑:source ./vartest.sh是在当前Shell会话中直接执行脚本代码,而非启动子Shell。从输出看两者行为一致,但底层存在以下区别:

1. 创建上下文不同

  • var1是在脚本执行前,由你在交互式Shell中手动定义的全局Shell变量(若你未执行export var1,则它是非环境变量;若执行过export,则同时是环境变量)。
  • var2是脚本执行时,在当前Shell中新增的全局Shell变量(默认是非环境变量,除非脚本中添加export var2)。

2. 变量属性可能不同

  • 若var1被导出过,它会出现在printenv的输出中,而var2默认不会;此时var1具备「环境变量」属性,可被后续启动的子Shell继承,var2则不行。
  • 从Bash内部存储来看,环境变量会被存入专门的环境变量表(传递给子进程时会复制该表),而非环境变量的全局Shell变量仅存在于当前Shell的内部变量表中,不会被子进程继承。

3. 生命周期的初始节点不同

var1的生命周期始于你手动定义它的时刻,而var2的生命周期始于脚本执行到var2="global_var2"这一行的时刻,两者均会持续到当前Shell会话结束(除非被unset命令删除)。

内容的提问来源于stack exchange,提问作者myoldgrandpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:25:51