首页 > 解决方案 > 如何修改作为参数传递给wapper(如回调)的函数中的全局变量值?

问题描述

我对作为 bash 参数的函数有疑问。

如果执行以下逻辑:

Var=5
Step=2

funct() {
    echo "[Line = $LINENO] $Var"
    Var=$(($Var+$Step))
    echo "[Line = $LINENO] $Var"
}

main()
{
    echo "[Line = $LINENO] $Var"
    funct
    echo "[Line = $LINENO] $Var"
}

main

输出是

[Line = 13] 5
[Line = 6] 5
[Line = 8] 7
[Line = 15] 7

如您所见, Var 已按预期更改。

但是,请检查以下示例,其中函数作为参数传递给包装器。

Var=5
Step=2

funct() {
    echo "[Line = $LINENO] $Var"
    Var=$(($Var+$Step))
    echo "[Line = $LINENO] $Var"
}

main()
{
    echo "[Line = $LINENO] $Var"
    funct
    echo "[Line = $LINENO] $Var"
}



main2()
{
    echo "[Line = $LINENO] $Var"
    ($1)
    echo "[Line = $LINENO] $Var"
}

main

main2 funct

结果是

[Line = 12] 5
[Line = 5] 5
[Line = 7] 7
[Line = 14] 7
[Line = 21] 7
[Line = 5] 7
[Line = 7] 9
[Line = 23] 7

请注意,回调包装器实际上不能修改 Var。

由于我现在正在做一个框架,所以可能希望一些常见的动作作为一般控制流的参数。

如何制作以函数为参数的包装器来真正修改全局变量?

谢谢~

标签: bashshellfunction-pointers

解决方案


($1)

$1在子外壳中运行,因为这就是括号在外壳中的作用。如果在子 shell 中运行函数,它不能更改全局变量(尽管它的执行环境是用父 shell 的变量初始化的,所以它可以看到它们)。

如果你想让回调函数在当前执行环境中运行,不要放在括号里。利用

"$1"

引号避免了$1包含空格或全局字符的问题。

一个更常见的成语是

"$@"

它通过额外的命令行参数。


推荐阅读