作用域如何作用于局部变量?

时间:2018-08-14 09:11:40

标签: bash

我总是觉得local变量是块作用域的,但有趣的是以下作品

f() {
    if true; then
        local red=red
    fi

    echo "$red"
}

那么Bash中local变量的作用域如何?

2 个答案:

答案 0 :(得分:5)

man bash说:

  

该函数本地的变量可以使用local内置声明。这些变量仅对函数及其调用的命令可见。

此外,关于local Bash builtin的部分说明:

  

local

local [option] name[=value] …
     

对于每个参数,将创建一个名为name的局部变量,并将其分配为value。该选项可以是declare接受的任何选项。 local只能在一个函数内使用;它使变量name的可见范围仅限于该函数及其子函数。

在Bash中没有诸如块作用域之类的东西:-(

答案 1 :(得分:4)

否,bash中的local变量是函数范围的,而 not 块的范围。另外请记住,local关键字不适用于功能以外的其他任何地方。

red='notred'
f() {
    if true; then
        local red=red
    fi
    echo "$red"
}

现在,如果您运行该功能

f; echo "$red"
red                # From the function's scope
notred             # From global scope

与实际问题不太相关,但是在使用local关键字时有一个提示,请始终将初始化与赋值分开。虽然听起来很琐碎,但如果在这种情况下使用不当

f() {
    if local boolean=$(false); then
        echo 'not cool!'
    fi
}

f() {
    local boolean
    if boolean=$(false); then
        echo 'not cool!'
    fi
}

不相同,并且始终首选后者。因为local是内置的bash,并且在成功分配时具有自己的返回码,即0。在第二种情况下,由于分配和初始化是分开的,因此我们确保local不会清除false命令返回的故障退出代码。