.profileに次のようにいくつかの環境変数を定義しました。
MY_HOME="/home/my_user"
ただし、引用符を削除してファイルを再インポートしないと、変数は評価されないようです。空白がある場合は引用符が必要であると考え、エスケープが必要ない場合は単一引用符を使用してください。変数定義で一重引用符と二重引用符の重要性を明確に説明できますか?前ティックと後ティックはどうですか?
答え1
用語について混乱していると思います。
「環境変数」は、すべての子プロセスが継承する単純なシェル変数です。
例で行ったことは、シェル変数を作成することです。エクスポート前の環境にはありません。
MY_HOME="/home/my_user"
export MY_HOME
ほとんどすべてのシェル(csh、tcshを除く)に「MY_HOME」という変数を配置します。
この特別な場合は二重引用符が重複します。効果はありません。二重引用符はサブストリングをグループ化しますが、変数置換のためにすべてのシェルを使用できるようにします。一重引用符は部分文字列をグループ化し、置換を防ぎます。例の割り当てには変数がないため、二重引用符が一重引用符として表示されることがあります。
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
エクスポートする前に環境には何もありません。
答え2
シェル変数と環境変数
MY_HOME="/home/my_user"
設定シェル変数MY_HOME
Shellはプログラミング言語であり、変数(パラメータとも呼ばれます)を持っています。割り当て後、変数の値を使用できますecho "$MY_HOME"
。
シェル変数は内部シェルの概念です。シェルインスタンスが終了するとMY_HOME
忘れてしまいます。各プログラムが知っている内容と子に送信する内容は次のとおりです。環境変数。
シェルの内部では、環境変数とシェル変数は非常によく似ています。実際に起こるのは、シェルが親から継承したすべての環境変数がシェル変数になるということです。対照的に、シェルスクリプトで定義されているシェル変数は、次の場合に環境変数になります。出口それ。
export MY_HOME="/home/my_user"
詳細は、初めて読むときにスキップできます。
シェル変数が自動的に環境変数にならない理由の1つは、スクリプトが誤って起動するプログラムに適した変数名を使用できるため、部分的には履歴変数です。
一部の非常に古いシェルでは、変数名が変更されるたびに非常に古いシェルを使用する必要があります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
ユーティリティに適用されます。
割り当て構文と割り当て構文export
には違いがあります。シェルは$foo
変数置換の結果をさらに拡張し、以下を実行します。フィールド(ワード)分割そしてパス名拡張(ワイルドカード)。つまりmyvar
、値がhello *
あるとecho $myvar
print 、hello
空白、現在のディレクトリのファイルのリストが順番に表示されます。これはほとんど望ましくないため、一般的な原則は次のとおりです。変数の置換には常に二重引用符を使用してください。(パス名拡張またはフィールド分割が必要であることを知らない限り):.echo "$myvar"
単純な割り当ての場合、toの値はothervar=$myvar
実際には確実にコピーされます。なぜなら、ワイルドカードとワードセパレータは割り当てで禁止されているからです(複数の単語を生成するが単一の単語を期待するからです)。単語) 。ただし、この免除は適用されません。したがって、単純な規則を覚えておくには、変数の置換に二重引用符を使用してください。myvar
othervar
export