2016-11-17 4 views
1

Betrachten Sie folgenden Code:Mit lokalen Variablen von „Kind“ Funktionen

function child() 
{ 
    echo $var 
} 

function parent() 
{ 
    local var=5 
    child 
} 

ich es auf meinem Rechner getestet haben und es scheint zu funktionieren, aber ich war etwas zu finden endgültige beschreibt eine solche Nutzung der lokalen nicht in der Lage Variablen. Wenn ich nämlich eine lokale Variable in einer Funktion deklariere und von dieser Funktion aus eine andere Funktion aufruft, kann ich dann die Variable in letzterer verwenden (und sie sogar noch tiefer verschachteln)? Ist es legal in bash und ist es Standard für alle Versionen?

+0

Von man bash 'Wenn lokalen innerhalb einer Funktion verwendet wird, verursacht es die Variablennamen einen sichtbaren Rahmen diese Funktion eingeschränkt haben und seine children.' – 123

+0

Warum ist dies ein Kommentar und keine Antwort? – NPS

+1

From man sh 'Die Shell verwendet dynamisches Scoping, so dass, wenn die Variable x lokal zu Funktion f gemacht wird, die dann Funktion g aufruft, beziehen sich Verweise auf die Variable x innerhalb von g auf die Variable x deklariert in f, nicht auf die globale Variable namens x.' – 123

Antwort

1

bash verwendet dynamisches Scoping. Der Wert var in child wird nicht durch child definiert, sondern durch ,. Wenn es im Körper von child keine lokale Definition gibt, ist die nächste Stelle, an der die Shell aussieht, im Körper der Funktion, von der child aufgerufen wird, und so weiter. Der Modifizierer local erstellt eine Variable in einer Funktion, die für diesen Aufruf lokal ist. Daher wirkt sich der Wert der Variablen nicht auf umschließende Bereiche aus. Es ist jedoch sichtbar für alle beiliegenden Bereich.

a() { echo "$var"; } 
b() { local var="local value"; a; } 

var="global value" 
a # outputs "global value" 
b # outputs "local value" 
0

Gerade beglückwünschend welche Benutzer 123 bereits in den Kommentaren

Von bash man pages

erwähnt

Variablen lokal für die Funktion mit dem lokalen eingebauten Befehl deklariert werden kann. Normalerweise werden Variablen und ihre Werte zwischen der Funktion und ihrem Aufrufer geteilt.

bash3.2.25->cat function.ss 
#!/bin/bash 
function child() 
{ 
     echo "child function called" 
     echo $var 
} 


function parent_global() 
{ 
     echo "parent_global called, child invoked outside parent" 
     var=5 
} 

function parent() 
{ 
     echo "parent called, child invoked inside parent" 
     local var=5 
     child 
} 

parent 
parent_global 
child 
bash3.2.25->./function.ss 
parent called, child invoked inside parent 
child function called 
5 
parent_global called, child invoked outside parent 
child function called 
5 

So angegeben, sofern nicht anders (die lokale builtin), sind Variablen sichtbar außerhalb des Funktionsumfangs, global, wenn man so will.

Verwandte Themen