Nach dem Lesen von 24.2. Lokale Variablen Ich dachte, dass das Deklarieren einer Variablen var
mit dem Schlüsselwort local
bedeutet, dass auf var
den 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 var
auch zugegriffen werden kann, lesen und von den Funktionen , die durch diesen Block von Code aufgerufen geschrieben - dh auch wenn var
erklärt wird , local
zu outerFunc
, innerFunc
ist 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.
var
leer ist? var
ist global festgelegt. innerFunc
Warum bleibt sie also nicht bis zum Ende des Skripts erhalten?