使用“子”函数中的局部变量

时间:2016-11-17 15:01:48

标签: bash variables scope

请考虑以下代码:

function child()
{
    echo $var
}

function parent()
{
    local var=5
    child
}

我已经在我的机器上测试了它似乎工作但我找不到任何明确描述这种局部变量用法的东西。也就是说,当我在一个函数中声明一个局部变量并从该函数中调用其他函数时,我可以在后者中使用该变量(甚至将其嵌套得更深)吗?它在bash中是否合法,是否适用于所有版本?

2 个答案:

答案 0 :(得分:1)

bash使用动态范围。 varchild的值不是由定义child的位置决定的,而是由称为的位置决定的。如果child的主体中没有本地定义,则shell看起来的下一个位置是调用child的函数体,依此类推。 local修饰符在函数中创建一个变量,该函数对于该调用是本地的,因此它不会影响来自任何封闭范围的变量的值。但是,任何封闭的范围都可以看到它。

a () { echo "$var"; }
b () { local var="local value"; a; }

var="global value"
a  # outputs "global value"
b  # outputs "local value"

答案 1 :(得分:0)

只是赞美用户123在评论中提到的内容

来自bash手册页

  

可以使用local builtin命令声明函数本地的变量。通常,变量及其值之间是共享的          功能及其来电。

bash3.2.25->cat function.ss 
#!/bin/bash
function child()
{
        echo "child function called"
        echo $var
}


function parent_global()
{
        echo "parent_global called, child invoked outside parent"
        var=5
}

function parent()
{
        echo "parent called, child invoked inside parent"
        local var=5
        child
}

parent
parent_global
child
bash3.2.25->./function.ss 
parent called, child invoked inside parent
child function called
5
parent_global called, child invoked outside parent
child function called
5

因此,除非另有说明( local builtin),否则变量在函数范围之外是可见的,如果愿意,则变为全局变量。