コマンドラインでの二重引用符「」、一重引用符「」、および逆引用符「」の違いは?


43

コマンドラインで次の文字を多用するWeb上のチュートリアルやこのサイトの投稿をよく見ます。多くの場合、かなり似た目的で使用されているようです。コマンドラインまたはシェルプログラミングで使用する場合の違いは何ですか?どの目的で使用しますか?

" " double quotes

' ' single quotes

` ` backticks

回答:


43

例として、変数foounamefoo=uname)が含まれていると考えてください。

  • echo "$foo"出力uname、テキスト内の変数の置換。
    • 引用符$内のリテラル文字に"は、\$;を使用します。リテラルには"、を使用します\"
  • echo '$foo'outputs $foo、正確な文字列。
    • さえ'のようにエスケープすることはできません\'内部の'引用符。ただし、を使用できます'foo'\''bar'
  • echo `$foo`出力Linux、変数の内容を実行して出力しますecho

\の前にある場合でも、単一引用符で囲まれている場合は常に文字通りに扱われ'ます。開始後、''は常に終了引用として解釈されます。'単一引用符で囲まれた文字列での引用のようなものは、引用を終了し、'個別にエスケープし、再び引用を開始することで実現できます。つまり、\'開始'文字と終了文字の間では機能しませんが、'\''機能します。(詳細については同じ間違いをしたときの私の投稿の1つに対するGilles修正を参照してください。)
エリアカガン14

11

これは、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

言い換えれば、単一引用符は文字列をシェルから完全に保護し、二重引用符はいくつかのもの(スペースなど)を保護しますが、変数と特殊文字を正しく展開/解釈できます。


1
OPが事実の後に変更されたかどうかはわかりませんが、この答えはバックティックに言及していませんか?
アレクサンダーミルズ

5

単一引用符('')は、引用符で囲まれた各文字のリテラル値を保持するために使用されます。

二重引用符("")を使用すると、ドル記号($)、バックティック(後方単一引用符、``)、および円記号(\)を除き、囲まれたすべての文字のリテラル値が保持されます。

バックティック(``)で囲まれている場合、シェルは「バックティック内のコマンドの出力」を意味する何かを解釈します。これは、コマンドの出力がコマンド自体の代わりになるため、「コマンド置換」と呼ばれます。

参照:


3
echo '$HOME' is "$HOME"

単一引用符は変数の展開を防ぎますが、二重引用符は変数の展開を許可します。


2

一般的に言っていますが、

""-出力前にそれらの内部の情報を処理するために使用されます。(PHPのように。)

  • たとえば、次のname=NESS; echo "Hello my name is $name"ように出力されます。Hello my name is NESS

''-出力をそのまま表示するために使用されます。(PHPでも同様です。)

  • 上記の例を使用すると、出力されます Hello my name is $name

したがって、二重引用符と単一引用符の違いは、二重引用符が変数を処理して値を表示するのに対し、単一引用符は変数名を処理せずに表示することです。

`` -後で別の変数に割り当てられるコマンドを引用するために使用されます。


1

単一引用符は、文字どおりに取られる値を囲みます。すべてのタイプの展開が抑制されます。通常、値が含まれている場合に使用したり、ホワイトスペース(空白、タブ、改行)、または特殊文字(含むことができ$\`ユーザーが拡張/シェルによって特別に扱われることを望んでいないことを)。

二重引用符は、変数を含む値を囲み、文字の置換が行われます。出力に空白が含まれる場合に必要であり、単一の値として割り当てる必要があります。

逆引用符はコマンドを囲み、その結果は値として必要です。新しいシェルでは$(...)、の代わりにを使用でき`...`ます。私は新しい方法を好みます。

次のコードは、何が起こっているのかを理解するのに役立ちます。

CMD = 'ls。'
エコー平方:$ CMD
$ CMDを設定
エコー生1:$ 1
echo raw:$ *
「$ CMD」を設定
エコーdq:$ 1
echo bq: `$ CMD`
echo new:$($ CMD)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.