コマンドラインからアクセスできる変数には2つの異なるタイプがあることを実際には知りませんでした。私が知っていたのは、次のような変数を宣言できることだけです。
foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"
または、次のように$記号でアクセスします:
echo $foo
echo ${bar[1]}
または、次のような組み込み変数を使用します:
echo $PWD
PATH=$PATH:"/usr/bin/myProg"
さて、変数にはシェル変数と環境変数の2種類(少なくとも?)があると聞きました。
- 2つの異なるタイプを持つ目的は何ですか?
- 変数がどのタイプであるかを知るにはどうすればよいですか?
- それぞれの一般的な使用法は何ですか?
承認された回答:
環境変数は、name=value
のリストです。 プログラムが何であれ(シェル、アプリケーション、デーモン…)存在するペア。これらは通常、子プロセスによって継承されます(fork
によって作成されます) / exec
シーケンス):子プロセスは、親変数の独自のコピーを取得します。
シェル変数は、シェルのコンテキストにのみ存在します。それらはサブシェルでのみ継承されます(つまり、シェルがexec
なしでフォークされた場合 手術)。シェルの機能によっては、変数は環境変数のような単純な文字列だけでなく、配列、複合変数、整数や浮動小数点などの型変数などもあります。
シェルが起動すると、親から継承するすべての環境変数もシェル変数になります(シェル変数として無効な場合や、IFS
などの他のコーナーケースを除く)。 これは一部のシェルによってリセットされます)が、これらの継承された変数はエクスポート済みとしてタグ付けされます。つまり、シェルによって設定された更新される可能性のある値を使用して、子プロセスで引き続き使用できるようになります。これは、シェルの下で作成され、export
でエクスポートされたものとしてタグ付けされた変数の場合にも当てはまります。 キーワード。
配列およびその他の複合型変数は、名前と値をname=value
に変換できない限り、エクスポートできません。 パターン、またはシェル固有のメカニズムが設定されている場合(例:bash
環境内の関数と、rc
などのいくつかのエキゾチックな非POSIXシェルをエクスポートします およびes
配列をエクスポートできます)。
したがって、環境変数とシェル変数の主な違いは、そのスコープです。環境変数はグローバルですが、エクスポートされていないシェル変数はスクリプトに対してローカルです。
最新のシェル(少なくともksh
およびbash
)3番目のシェル変数スコープをサポートします。 typeset
を使用して関数で作成された変数 キーワードはその関数に対してローカルです(関数が宣言される方法は、ksh
でこの機能を有効/無効にします 、および永続性の動作はbash
間で異なります およびksh
)。 https://unix.stackexchange.com/a/28349/2594
これはksh
のような最新のシェルに適用されます 、dash
、bash
および同様。従来のBourneシェルとcsh
のような非Bourne構文シェル 動作が異なります。