我总是觉得local
变量是块作用域的,但有趣的是以下作品
f() {
if true; then
local red=red
fi
echo "$red"
}
那么Bash中local
变量的作用域如何?
答案 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
命令返回的故障退出代码。