-1

我想写一个类似于read内置的函数,我将变量名作为参数传递,函数将其结果返回到名为的变量中。

我试着这样做:

GLOBAL_VAR=0

foo() {
    local var="$1"; shift
    local result

    # ...

    (( GLOBAL_VAR++ ))

    # ...

    eval "${var}=\${result}"
}

foo但是,上面有一个问题:如果我使用第一个参数varor调用,上面的内容就不起作用result,因为这样赋值就变成了内部定义的局部变量,foo而不是它的调用者。实际上,这泄漏了foo.

如果我使用 nameref 代替 ( local -n),则运行foo var会产生一条警告消息,而foo result不会向调用者返回任何内容,因为该result变量是在函数中分配的。而且我不能只是将变量重命名为不会冲突的东西,因为我实际上打算在这里执行递归,因此变量将不可避免地与自身发生冲突。Namerefs 根本无法解决我的问题。

我也不能使用子shell,因为这样对全局变量的任何修改都会丢失。

有没有办法分配给调用者上下文中定义的动态命名变量?

(换句话说,我正在寻找 Tcl 的 bash 等价物upvar。)

4

1 回答 1

-1

我怀疑你最终会得到类似的东西:

foo() {
    local result
    result="some computation with $1"
    echo "$result"
}

thing=$(set -eu; foo)
于 2020-05-05T18:02:21.623 回答