2016-11-17 1 views
1

次のコードを考えてみましょう:私は私のマシン上でそれをテストしてみたし、それが動作しているようですが、私は地元の何も決定的な記述、そのような使い方を見つけることができませんでした「子」の機能からローカル変数を使用して

function child() 
{ 
    echo $var 
} 

function parent() 
{ 
    local var=5 
    child 
} 

を変数。つまり、ある関数でローカル変数を宣言し、その関数から他の関数​​を呼び出すと、後者で変数を使用することができます(さらに深く入れ子にすることもできます)。それはbashで合法ですか、それはすべてのバージョンの標準ですか?

+0

は 'ローカルが関数内で使用される場合、それはその機能に制限見える範囲を持っている変数名を引き起こし、そのchildren.' – 123

+0

なぜこれがコメントしていない答えは? – NPS

+1

from man sh 'シェルは動的スコープを使用しているので、変数xが関数fに対してローカルであり、関数gを呼び出した場合、変数gは関数gを呼び出し、 への参照はg内で作成された変数xを参照し、 xという名前のグローバル変数にはありません。 – 123

答えて

1

bashは動的スコープを使用します。 childvarの値は、childが定義されていますが、と定義されています。となります。 childの本体にローカル定義がない場合、シェルが次に見る場所は、childが呼び出される関数の本文にあります。 local修飾子は、その呼び出しにローカルな関数に変数を作成するため、囲みスコープの変数の値には影響しません。しかし、にはスコープで囲まれています。男のbashから

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

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

ただ、すでに地元の組み込みコマンドを使用して宣言することができる機能に

変数ローカルbashのmanページからのコメント

で述べたものをユーザー123ほめます。通常、変数とその値は関数とその呼び出し元で共有されます。

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 

ので(ローカル組み込み)特に指定のない限り、あなたがする場合は、変数は、関数のスコープ外でグローバル表示されます。

関連する問題