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:]
Q:それは私のシェル(bash 4.3.42、Ubuntu 16.04、64bit)のバグですか、それとも予想される動作ですか?
編集:解決しました。@MarkPlotnickで述べたように、これは実際に予想される動作です。
var
が空であるとおかしいと思うのは私だけですか?var
でグローバルに設定されているinnerFunc
ので、なぜスクリプトの最後まで固定されないのですか?