Bash中如何简便重置nameref(名称引用)?
如何在Bash中简便切换nameref的引用对象?
在Bash函数中使用nameref(名称引用)时,一旦通过ref="somevar"将其关联到目标变量,后续直接对ref赋值只会修改目标变量的值,无法切换到新的引用对象。你之前找到的unset -n ref再重新声明的方法确实繁琐,这里提供两种更简便的可行方案:
方案1:直接重新用local -n/declare -n绑定新变量
对于已声明为局部nameref的变量,无需先取消引用,直接再次使用local -n并赋值新的变量名,即可重新绑定引用对象:
func () { local -n ref ref="somevar" ref="somevalue" # 直接切换到新的引用对象 local -n ref="someothervar" # 现在ref关联的是someothervar,赋值会修改它 ref="newvalue" }
如果是全局nameref,替换为declare -n ref="someothervar"即可。
方案2:合并取消引用与重新声明
如果觉得重复写local -n不够简洁,可以将取消引用和重新声明合并为一行:
func () { local -n ref ref="somevar" ref="somevalue" # 取消引用后立即重新绑定新变量 unset -n ref && local -n ref="someothervar" }
注意事项
- 以上方法仅适用于Bash 4.3及以上版本(nameref特性从该版本开始支持)。
- 重新绑定后,后续对
ref的操作都会作用于新的目标变量,不会影响之前的somevar。
内容的提问来源于stack exchange,提问作者terr
相关产品推荐
相关产品推荐

