Bash中local命令的-n参数含义及与local var的区别
Bash中
local -n的-n参数含义及与local的区别 一、-n参数的核心作用
local -n var里的-n是用来定义**名称引用(nameref)**类型的局部变量。直白点说,var不是一个存值的普通变量,而是一个"指向器"——它会绑定到另一个已存在的变量上,对var的读写操作,实际都会直接作用到它绑定的目标变量上。
二、和普通local var的本质区别
普通local var是在当前函数作用域里新建一个独立的局部变量,它和外部同名变量完全没关系,改它不会影响外面的变量。而local -n var是让这个局部变量成为其他作用域变量的"别名",两者共用同一块值存储空间,改一个等于改另一个。
示例1:普通local的独立行为
test_normal_local() { local msg="函数内的局部值" echo "函数内:$msg" } msg="全局初始值" test_normal_local echo "函数外:$msg"
运行结果:
函数内:函数内的局部值
函数外:全局初始值
函数内的msg是独立局部变量,和全局msg互不干扰。
示例2:local -n的引用行为
test_nameref_local() { local -n ref=$1 # 把ref绑定到传入的变量名对应的变量上 ref="通过引用修改后的内容" echo "函数内引用变量的值:$ref" } msg="全局初始值" test_nameref_local msg # 传入变量名(不是变量值) echo "函数外全局变量的值:$msg"
运行结果:
函数内引用变量的值:通过引用修改后的内容
函数外全局变量的值:通过引用修改后的内容
这里ref是msg的引用,修改ref直接改变了全局的msg。
关于避免!参数展开的说明
你提到的避免!参数展开,是因为在没有-n的时候,要间接操作变量通常会用!或者eval,比如:
test_old_way() { local var_name=$1 # 用!间接引用,写法绕且易出错 ${!var_name}="用!修改的值" # 或者用eval,风险更高 # eval "$var_name='用eval修改的值'" }
而local -n可以更安全、直观地实现间接变量操作,不需要依赖这些容易出问题的写法,代码可读性和安全性都更高。
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

