【Shell 变量作用域详解】

文章目录


一、什么是变量作用域?

变量作用域指的是:
变量在什么范围内可以被访问和使用。

在 Shell 中,变量主要分为两种:

  • 全局变量
  • 局部变量

作用域决定了:

  • 哪些地方可以访问变量
  • 是否会影响其他函数
  • 是否会被覆盖

二、全局变量

1. 什么是全局变量?

在 Shell 中:

默认定义的变量都是全局变量。

特点:

  • 在整个脚本中都可以访问
  • 在函数内部也可以访问
  • 容易被修改和覆盖

2. 基本示例

bash 复制代码
#!/bin/bash

name="Alice"

function test() {
    echo "函数内部读取全局变量: $name"
}

test
echo "函数外部读取变量: $name"

输出结果

复制代码
函数内部读取全局变量: Alice
函数外部读取变量: Alice

说明:

  • 在函数内可以访问函数外定义的变量
  • 这就是全局变量的特性

3. 全局变量被函数修改

bash 复制代码
#!/bin/bash

count=10

function change() {
    count=20
}

change
echo "count = $count"

输出:

复制代码
count = 20

说明:

  • 函数可以直接修改全局变量
  • 这也是很多 BUG 的来源

三、局部变量

1. 什么是局部变量?

局部变量:

  • 只能在函数内部使用
  • 函数执行结束后自动销毁
  • 不会影响全局变量

使用关键字:

bash 复制代码
local

注意:

local 只能在函数内部使用!


2. 基本示例

bash 复制代码
#!/bin/bash

function test() {
    local age=25
    echo "函数内部 age = $age"
}

test
echo "函数外部 age = $age"

输出:

复制代码
函数内部 age = 25
函数外部 age =

说明:

  • age 在函数外部不可用
  • 这就是局部变量的作用域

3. 局部变量不会影响全局变量

bash 复制代码
#!/bin/bash

name="Tom"

function test() {
    local name="Jerry"
    echo "函数内部 name = $name"
}

test
echo "函数外部 name = $name"

输出:

复制代码
函数内部 name = Jerry
函数外部 name = Tom

说明:

  • 函数内部定义了一个同名局部变量
  • 不会影响全局变量

四、局部变量 vs 全局变量对比

特性 全局变量 局部变量
定义位置 脚本任意位置 函数内部
是否需要关键字 否 需要 local
作用范围 整个脚本 当前函数
是否会污染环境 会 不会
是否推荐使用 少量使用 推荐使用

五、案例:函数计算求和

场景

写一个函数计算两个数之和。

错误写法(使用全局变量)

bash 复制代码
#!/bin/bash

a=10
b=20
sum=0

function add() {
    sum=$((a + b))
}

add
echo "结果: $sum"

问题:

  • sum 是全局变量
  • 容易被其他函数覆盖

正确写法(使用局部变量)

bash 复制代码
#!/bin/bash

function add() {
    local a=$1
    local b=$2
    local sum=$((a + b))
    echo $sum
}

result=$(add 10 20)
echo "结果: $result"

优点:

  • 所有变量都在函数内部
  • 不污染全局环境
  • 更安全、更规范

六、案例:统计文件数量

bash 复制代码
#!/bin/bash

function count_files() {
    local dir=$1
    local total=$(ls "$dir" | wc -l)
    echo "$dir 目录文件数量: $total"
}

count_files /etc
count_files /usr

说明:

  • dir 是局部变量
  • total 也是局部变量
  • 不会影响其他函数

七、为什么推荐使用局部变量?

在实际项目中:

如果大量使用全局变量,会导致:

  • 变量名冲突
  • 数据被意外修改
  • 脚本难以维护
  • 调试困难

最佳实践:

  • 函数内部优先使用 local
  • 只在必要时使用全局变量
相关推荐
小李科技22 分钟前
【性能优化】事件委托:目标定位与 React/Vue 实战
前端·vue.js·react.js·面试·性能优化·前端框架
QianhangQianping28 分钟前
一块大屏的数据在浏览器里怎么变成画面:背景、子屏、前景三层结构
前端·低代码·架构·编辑器·数据可视化·大屏可视化
梦想很大很大40 分钟前
让 Codex 自由发挥,给 nvm-desktop 换个 UI
前端·人工智能·设计
蓝莓味的口香糖44 分钟前
【VUE】【CSS】Vue移动端适配主流方案总结
前端·css·vue.js
shennv8881 小时前
接入大模型流式输出后,文字偶尔乱码?问题可能出在前端
前端
csj501 小时前
前端基础之《React(16)—Modal组件封装》
前端·react.js
雨季mo浅忆1 小时前
Vue关于前端XSS漏洞修复方案
前端·xss
切糕师学AI1 小时前
el-select-v2 深度解析:用虚拟滚动解决海量数据下拉选择性能瓶颈
前端·vue.js·elementui·el-select-v2
徐小夕1 小时前
JitOffice:把办公、AI 与审批装进同一个平台
前端·vue.js·github
徐小夕1 小时前
万字分享:为什么我们要自研Word解析引擎?JitWord 解析引擎 4.0 深度复盘
前端·vue.js·github