環境変数での一重引用符と二重引用符の意味は何ですか?


19

.profileで次のようにいくつかの環境変数を定義しました。

MY_HOME="/home/my_user"

しかし、引用符を取り除いてファイルを再ソースしない限り、変数は評価されないようです。スペースがある場合は引用符が必要であり、エスケープが望ましくない場合は一重引用符が使用されると思います。誰かが変数定義での一重引用符と二重引用符の重要性を明確にできますか?フロントティックとバックティックはどうですか?

回答:


23

用語について混乱していると思います。

「環境変数」は、子プロセスが継承する単なるシェル変数です。

この例では、シェル変数を作成しています。エクスポートするまで環境にはありません。

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

エクスポートするまで、環境には何もありません。


18

シェル変数と環境変数

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さらに展開し、フィールド(単語)分割パス名展開(グロビング)を実行します。値があればということ。この意味myvarhello ​ *、その後、echo $myvarプリントhello単一のスペースに続いては、現在のディレクトリ内のファイルのリストが続きます。これはほとんど望ましくないため、変数の置換常に二重引用符で囲むという一般原則です(パス名の展開またはフィールドの分割が必要なことがわかっている場合を除く)echo "$myvar"。単純な割り当ての場合othervar=$myvar、実際にはmyvarto の値を確実にコピーしますothervar、割り当てでグロビングと単語分割が禁止されているためです(複数の単語を作成しますが、単一の単語が予期されるため)。exportただし、この分配はには適用されません。したがって、単純なルールを覚えたい場合は、常に変数の置換を二重引用符で囲んでください。


「引用はほとんど直交しています」を説明してください。「クォートについて」セクションで?その文章では直交の意味がわかりません。
モニカのための正義14

1
@DKBoseこれは、一方で環境変数とシェル変数、および他方で引用することは、互いにほとんど関係のない2つの別個の問題であることを意味します。ウィクショナリー意味4と5
ジル「SO-停止されて悪」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.