如何修改作为参数传递给wapper(如回调)的函数中的全局变量值?

时间:2018-05-15 03:04:32

标签: bash shell function-pointers

我有一个关于函数作为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。

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

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

感谢〜

2 个答案:

答案 0 :(得分:4)

($1)

在子shell中运行$1,因为它在shell中为what parentheses do。如果你在子shell中运行一个函数,它就不能改变全局变量(虽然它的执行环境是用父shell的变量初始化的,所以它可以看到它们。)

如果您希望回调函数在当前执行环境中运行,请不要将其放在括号中。使用

"$1"

引号可以避免$1包含空格或整数字符的问题。

更常见的习语是

"$@"

通过其他命令行参数。

答案 1 :(得分:0)

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

我发现删除()的工作,但不知道为什么......