我想写一个类似于read
内置的函数,我将变量名作为参数传递,函数将其结果返回到名为的变量中。
我试着这样做:
GLOBAL_VAR=0
foo() {
local var="$1"; shift
local result
# ...
(( GLOBAL_VAR++ ))
# ...
eval "${var}=\${result}"
}
foo
但是,上面有一个问题:如果我使用第一个参数var
or调用,上面的内容就不起作用result
,因为这样赋值就变成了内部定义的局部变量,foo
而不是它的调用者。实际上,这泄漏了foo
.
如果我使用 nameref 代替 ( local -n
),则运行foo var
会产生一条警告消息,而foo result
不会向调用者返回任何内容,因为该result
变量是在函数中分配的。而且我不能只是将变量重命名为不会冲突的东西,因为我实际上打算在这里执行递归,因此变量将不可避免地与自身发生冲突。Namerefs 根本无法解决我的问题。
我也不能使用子shell,因为这样对全局变量的任何修改都会丢失。
有没有办法分配给调用者上下文中定义的动态命名变量?
(换句话说,我正在寻找 Tcl 的 bash 等价物upvar
。)