回答:
これは、bashマニュアルの関連セクションで非常にうまく説明されています。簡単に言えば、一重引用符内のすべては文字通りに解釈されます。したがって、たとえば:
$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}
それを引用されていないバージョンと比較してください:
$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3
二重引用符を使用すると、変数を展開できます(履歴の展開なども可能です)。基本的に、拡張したいものを扱う場合に使用します。例えば:
$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash
言い換えれば、単一引用符は文字列をシェルから完全に保護し、二重引用符はいくつかのもの(スペースなど)を保護しますが、変数と特殊文字を正しく展開/解釈できます。
単一引用符(''
)は、引用符で囲まれた各文字のリテラル値を保持するために使用されます。
二重引用符(""
)を使用すると、ドル記号($
)、バックティック(後方単一引用符、``
)、および円記号(\
)を除き、囲まれたすべての文字のリテラル値が保持されます。
バックティック(``
)で囲まれている場合、シェルは「バックティック内のコマンドの出力」を意味する何かを解釈します。これは、コマンドの出力がコマンド自体の代わりになるため、「コマンド置換」と呼ばれます。
参照:
一般的に言っていますが、
""
-出力前にそれらの内部の情報を処理するために使用されます。(PHPのように。)
name=NESS; echo "Hello my name is $name"
ように出力されます。Hello my name is NESS
''
-出力をそのまま表示するために使用されます。(PHPでも同様です。)
Hello my name is $name
したがって、二重引用符と単一引用符の違いは、二重引用符が変数を処理して値を表示するのに対し、単一引用符は変数名を処理せずに表示することです。
``
-後で別の変数に割り当てられるコマンドを引用するために使用されます。
単一引用符は、文字どおりに取られる値を囲みます。すべてのタイプの展開が抑制されます。通常、値が含まれている場合に使用したり、ホワイトスペース(空白、タブ、改行)、または特殊文字(含むことができ$
、\
、`
ユーザーが拡張/シェルによって特別に扱われることを望んでいないことを)。
二重引用符は、変数を含む値を囲み、文字の置換が行われます。出力に空白が含まれる場合に必要であり、単一の値として割り当てる必要があります。
逆引用符はコマンドを囲み、その結果は値として必要です。新しいシェルでは$(...)
、の代わりにを使用でき`...`
ます。私は新しい方法を好みます。
次のコードは、何が起こっているのかを理解するのに役立ちます。
CMD = 'ls。' エコー平方:$ CMD $ CMDを設定 エコー生1:$ 1 echo raw:$ * 「$ CMD」を設定 エコーdq:$ 1 echo bq: `$ CMD` echo new:$($ CMD)
\
の前にある場合でも、単一引用符で囲まれている場合は常に文字通りに扱われ'
ます。開始後、'
次'
は常に終了引用として解釈されます。'
単一引用符で囲まれた文字列での引用のようなものは、引用を終了し、'
個別にエスケープし、再び引用を開始することで実現できます。つまり、\'
開始'
文字と終了文字の間では機能しませんが、'\''
機能します。(詳細については同じ間違いをしたときの私の投稿の1つに対するGillesの修正を参照してください。)