看完24.2。局部变量,我认为var
使用关键字声明变量local
意味着var
仅在函数的花括号分隔的代码块中可以访问的值。
但是,在运行以下示例之后,我发现var
也可以从该代码块调用的函数中进行访问,读取和写入-即,即使var
被声明local
为outerFunc
,innerFunc
也仍然可以读取和更改其值。
#!/usr/bin/env bash
function innerFunc() {
var='new value'
echo "innerFunc: [var:${var}]"
}
function outerFunc() {
local var='initial value'
echo "outerFunc: before innerFunc: [var:${var}]"
innerFunc
echo "outerFunc: after innerFunc: [var:${var}]"
}
echo "global: before outerFunc: [var:${var}]"
outerFunc
echo "global: after outerFunc: [var:${var}]"
输出:
global: before outerFunc: [var:] # as expected, `var` is not accessible outside of `outerFunc`
outerFunc: before innerFunc: [var:initial value]
innerFunc: [var:new value] # `innerFunc` has access to `var` ??
outerFunc: after innerFunc: [var:new value] # the modification of `var` by `innerFunc` is visible to `outerFunc` ??
global: after outerFunc: [var:]
问:这是我的shell(bash 4.3.42,Ubuntu 16.04、64位)中的错误,还是预期的行为?
编辑:解决。如@MarkPlotnick所指出的,这确实是预期的行为。
var
空很奇怪的人吗?var
是在中全局设置的innerFunc
,那么为什么不一直坚持到脚本结束?