文章目录
- 一、什么是变量作用域?
- 二、全局变量
-
- [1. 什么是全局变量?](#1. 什么是全局变量?)
- [2. 基本示例](#2. 基本示例)
- [3. 全局变量被函数修改](#3. 全局变量被函数修改)
- 三、局部变量
-
- [1. 什么是局部变量?](#1. 什么是局部变量?)
- [2. 基本示例](#2. 基本示例)
- [3. 局部变量不会影响全局变量](#3. 局部变量不会影响全局变量)
- [四、局部变量 vs 全局变量对比](#四、局部变量 vs 全局变量对比)
- 五、案例:函数计算求和
- 六、案例:统计文件数量
- 七、为什么推荐使用局部变量?
一、什么是变量作用域?
变量作用域指的是:
变量在什么范围内可以被访问和使用。
在 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
- 只在必要时使用全局变量