Linux Shell 中只有 local 关键字能定义真正局部变量,仅在函数内有效且屏蔽同名全局变量;不加 local 则变量为全局,修改会直接影响外部。

在 Linux Shell 脚本中,局部变量的作用域默认并不受限——函数内直接定义的变量是全局可见的。真正能限制作用域的,只有 local 关键字,且它仅在函数内部有效。
用 local 声明真正的局部变量
在函数体内使用 local 显式声明,该变量就只在当前函数执行期间存在,退出函数后自动销毁,外部无法访问。
- 语法简单:
local var_name=value(等号前后不能有空格) - 支持同时声明多个:
local a=1 b="test" c(c 未赋值,为空字符串) - 若不加
local,即使写在函数里,变量也属于全局作用域
局部变量会屏蔽同名全局变量
当函数内用 local 定义了与全局变量同名的变量时,函数内所有对该名称的引用都指向局部变量,全局变量被临时“遮盖”,但原值不受影响。
- 示例:全局有
count=10,函数内写local count=99,则echo $count输出 99;函数外仍为 10 - 这种屏蔽只发生在当前函数内,不影响其他函数或脚本主体
注意 local 只在函数中生效,且依赖 Shell 类型
local 是 Bash、Zsh 等主流 Shell 的内置关键字,在 POSIX sh 中不可用。如果脚本指定 #!/bin/sh,使用 local 会导致报错。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 确保 shebang 正确,如
#!/bin/bash - 在函数开头集中声明局部变量,避免逻辑混乱
- 不要在条件分支或循环体内部单独使用
local声明同名变量(虽语法允许,但易读性差)
对比:不加 local 的“伪局部”行为
很多人误以为函数内定义的变量天然局部,其实不然。例如:
msg="start"
myfunc() {
msg="done" # 没有 local → 修改的是全局 msg
}
myfunc
echo $msg # 输出 "done",不是 "start"
这说明:不加 local 就没有作用域隔离,变量修改会穿透到外部。










