foo
2つの機能があるとしましょうbar
。
foo() {
FOO=foo
}
私はこれを行うことができます:
bar() {
echo $FOO
}
$ bar
$ foo
しかし、これを行うこともできます。
bar() {
echo $1
}
$ bar $FOO
$ foo
そして
foo() {
local foo=foo
return $foo
}
bar() {
echo $1
}
$ bar foo
$ foo
変数が異なる関数、同じスクリプト、または他のスクリプトで使用できる場合、変数の範囲がグローバルであるかどうかを判断するにはどうすればよいですか?
Bashで変数管理機能を使用する方法の正しい方法や規則はありますか?
答え1
環境変数
プログラムが呼び出されると、環境と呼ばれる文字列の配列が提供されます。これは、名前=値の形式の名前と値のペアのリストです。
Bashは環境を操作するためのいくつかの方法を提供します。呼び出されると、シェルは環境をスキャンし、見つかった各名前の引数を生成して自動的に子プロセスにエクスポートできるようにします。実行されたコマンドは環境を継承します。エクスポートおよび「declare -x」コマンドを使用すると、パラメータと機能を環境に追加および削除できます。環境のパラメーター値が変更されると、新しい値が環境の一部になり、古い値を置き換えます。実行されたコマンドによって継承された環境は、シェルの値を変更できるシェルの初期環境で、unsetコマンドと「export -n」コマンドで削除されたすべてのペアを減算し、エクスポートおよび「declare -xで追加された値」で構成されます。になります。 " はすべてのコンテンツコマンドをコマンドします。
これらの変数は、この環境で実行されているすべてのスクリプトに表示されます。
コマンドを実行して表示できますenv
。
export
組み込みまたはdeclare -x
グローバル変数
グローバル変数は、サブシェル/関数によって生成されたサブプロセスを含む単一のプログラム(スクリプト)内のすべての項目に表示されますが、プログラム(スクリプト)全体では表示されません。
特にエクスポートまたはローカルで宣言されていないすべての変数はグローバル変数になります。
ローカル変数
関数のローカル変数は、ローカル組み込み変数を使用して宣言できます。これらの変数は、関数と関数が呼び出すコマンドにのみ表示されます。これは、シェル関数が他の関数を呼び出すときに特に重要です。
ローカル変数は、前の範囲で宣言された変数と同じ名前の変数を「シャドウ」にします。たとえば、関数内で宣言されたローカル変数は、同じ名前のグローバル変数を隠します。参照と割り当てはローカル変数を参照しますが、グローバル変数は変更されません。関数が返されると、グローバル変数が再び表示されます。
Shell は動的スコープを使用して関数内変数の可視性を制御します。動的スコープを使用すると、表示される変数とその値は、現在の関数に到達するように実行を導いた一連の関数呼び出しの結果です。関数に表示される変数の値は、呼び出し元が「グローバル」スコープか他のシェル関数かによって、呼び出し元(存在する場合)内の値によって異なります。これは、ローカル変数宣言によって「隠された」値でもあり、関数が返されたときに復元される値でもあります。
たとえば、var変数がfunc1関数のローカル変数として宣言され、func1が別の関数func2を呼び出す場合、func2のvarへの参照はfunc1のローカル変数varとして解決され、varというグローバル変数を非表示にします。
これらの変数は、その変数が宣言された関数とすべての子関数にのみ表示されます。
local
これらの変数は、組み込み変数を使用するか、単にdeclare
関数内で使用してローカル変数として明示的に宣言する必要があります。