.profileで次のようにいくつかの環境変数を定義しました。
MY_HOME="/home/my_user"
しかし、引用符を取り除いてファイルを再ソースしない限り、変数は評価されないようです。スペースがある場合は引用符が必要であり、エスケープが望ましくない場合は一重引用符が使用されると思います。誰かが変数定義での一重引用符と二重引用符の重要性を明確にできますか?フロントティックとバックティックはどうですか?
.profileで次のようにいくつかの環境変数を定義しました。
MY_HOME="/home/my_user"
しかし、引用符を取り除いてファイルを再ソースしない限り、変数は評価されないようです。スペースがある場合は引用符が必要であり、エスケープが望ましくない場合は一重引用符が使用されると思います。誰かが変数定義での一重引用符と二重引用符の重要性を明確にできますか?フロントティックとバックティックはどうですか?
回答:
用語について混乱していると思います。
「環境変数」は、子プロセスが継承する単なるシェル変数です。
この例では、シェル変数を作成しています。エクスポートするまで環境にはありません。
MY_HOME="/home/my_user"
export MY_HOME
ほとんどすべてのシェルに「MY_HOME」という名前の変数を配置します(csh、tcshを除く)。
この特定のケースでは、二重引用符は不要です。効果はありません。二重引用符は部分文字列をグループ化しますが、変数の置換に使用するシェルを許可します。シングルクォートは部分文字列をグループ化し、置換を防ぎます。サンプルの割り当てには変数が含まれていないため、二重引用符は単一引用符として表示される可能性があります。
V='some substrings grouped together' # assignment
X="Put $V to make a longer string" # substitution and then assignment
Y=`date` # run command, assign its output
Z='Put $V to make a longer string' # no substition, simple assignment
エクスポートするまで、環境には何もありません。
MY_HOME="/home/my_user"
設定シェル変数と呼ばれるがMY_HOME
。シェルはプログラミング言語であり、変数(パラメーターとも呼ばれます)があります。この割り当ての後、変数の値を使用できます(例:)echo "$MY_HOME"
。
シェル変数は、内部シェルの概念です。そのシェルインスタンスが終了すると、MY_HOME
忘れられます。すべてのプログラムが知っており、その子に送信するのは環境変数です。
シェル内では、環境変数とシェル変数は非常によく似た方法で機能します。実際に起こることは、シェルがその親から継承するすべての環境変数がシェル変数になることです。逆に、シェルスクリプトで定義されているシェル変数は、エクスポートすると環境変数になります。
export MY_HOME="/home/my_user"
シェル変数が自動的に環境変数にならない理由は、スクリプトが起動するプログラムにとって意味のある変数名を誤って使用する可能性があり、一部は単に歴史的であるためです。
export
変数名を変更するたびにいくつかの非常に古いシェルを使用する必要がありましたが、最新のシェルはすべて環境変数の割り当てを追跡するため、次のスニペットがエコーしますbar
。
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
また、いくつかの非常に古いシェルはのために別のコマンドを必要とmyvar=foo
してexport myvar
ますが、すべての近代的なシェルが理解しますexport myvar=foo
。
実行set -a
して、すべてのシェル変数の割り当てで変数を自動的にエクスポートできるため、最初にそのシェルで実行した場合myvar=foo
と同等export myvar=foo
ですset -a
。
引用はほとんど直交しています。変数に割り当てる値にシェル固有の文字が含まれていない場合、引用符は必要ありません。特殊文字がある場合は、一重引用符、二重引用符、バックスラッシュ、またはそれらの組み合わせで保護する必要があります。これは、単純なmyvar=value
構文とexport
ユーティリティの両方に当てはまります。
割り当て構文と構文には1つの違いがありexport
ます。シェルは、変数置換の結果を$foo
さらに展開し、フィールド(単語)分割とパス名展開(グロビング)を実行します。値があればということ。この意味myvar
でhello *
、その後、echo $myvar
プリントhello
単一のスペースに続いては、現在のディレクトリ内のファイルのリストが続きます。これはほとんど望ましくないため、変数の置換を常に二重引用符で囲むという一般原則です(パス名の展開またはフィールドの分割が必要なことがわかっている場合を除く)echo "$myvar"
。単純な割り当ての場合othervar=$myvar
、実際にはmyvar
to の値を確実にコピーしますothervar
、割り当てでグロビングと単語分割が禁止されているためです(複数の単語を作成しますが、単一の単語が予期されるため)。export
ただし、この分配はには適用されません。したがって、単純なルールを覚えたい場合は、常に変数の置換を二重引用符で囲んでください。