Nach dem Lesen von 24.2. Lokale Variablen Ich dachte, dass das Deklarieren einer Variablen varmit dem Schlüsselwort localbedeutet, dass auf varden Wert nur innerhalb des Codeblocks zugegriffen werden kann, der durch die geschweiften Klammern einer Funktion begrenzt wird.
Doch nach dem folgende Beispiel ausgeführt wird , fand ich , dass aus varauch zugegriffen werden kann, lesen und von den Funktionen , die durch diesen Block von Code aufgerufen geschrieben - dh auch wenn varerklärt wird , localzu outerFunc, innerFuncist noch in der Lage , es zu lesen und seinen Wert zu verändern.
#!/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}]"
Ausgabe:
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:]
F: Ist das ein Fehler in meiner Shell (bash 4.3.42, Ubuntu 16.04, 64bit) oder ist es das erwartete Verhalten?
EDIT: Gelöst. Wie von @MarkPlotnick festgestellt, ist dies in der Tat das erwartete Verhalten.
varleer ist? varist global festgelegt. innerFuncWarum bleibt sie also nicht bis zum Ende des Skripts erhalten?