トップ > Linuxらしい使い方を覚える >
引用符と二重引用符で空白を含むテキストを作る

  

'(引用符)と"(二重引用符)でクォーティングする

この記事では、シェル内でのテキストの表記方法である "クォーティング" について解説します。 クォーティング(Quoting)を直訳すると、"引用" となりますが、この記事で紹介するクォーティングは、

  1. 文字を'(引用符)で囲む
  2. 文字を"(二重引用符)で囲む

ということを指します。 他人の著作物を副次的に紹介する行為のことではありません

クォーティングはどんな場面で役に立つのでしょうか。 それは、空白を含む単語を作りたい場合です。 例えば、

Hello    World

のように2つ以上の空白を含むメッセージを表示したい場合などです。

  
Hello と World の間には4つの空白を入れています。

では試しに、echo コマンドを使って上のメッセージを表示してみましょう。 端末を開き、キーボードから echo Hello    World と入力して、Enterキーを押してください。


echo Hello    World

 
  
Hello と World の間に4つの空白を入れてください。

以下のように4つ入れた空白が1つになってしまいます

taro@myhostname:~$ echo Hello    World
Hello World
taro@myhostname:~$

空白が1つになった理由はシェルにあります。 シェルは、

echo Hello    World

という命令を受けて以下のように解釈します。

コマンド echo
引数1 Hello
引数2 World

シェルは受けた命令を空白で分解するため、上のように引数が2つあると解釈されてしまいます。 そのため、echo コマンドには、

  • Hello
  • World

の2つの引数が渡されます。 2つの引数を渡された echo コマンドは、全ての引数を空白でつなげて表示します。 そのため、

Hello World

のように、空白が1つになってしまいました。

2つ以上連続する空白を表示させるには、引数を '(引用符) で囲む必要があります。 実際にやってみましょう。 キーボードから echo 'Hello    World' と入力して、Enterキーを押してください。


echo 'Hello    World'

 

以下のように空白が4つ連続で表示されます。 狙い通りの結果です。

taro@myhostname:~$ echo 'Hello    World'
Hello    World
taro@myhostname:~$

このように '(引用符) で囲むことで、シェルに1つの引数として認識させることができます。 よって、シェルの解釈の結果は、

コマンド echo
引数1 Hello    World

となります。 echo コマンドには空白を含む1つのテキストとして渡されます。

  
引数1 には "(二重引用符) は含まれません。 そのため、echo コマンドの表示結果に "(二重引用符) は現れていません。

では次に、'(引用符) ではなく "(二重引用符) で囲んでみましょう。 キーボードから echo "Hello    World" と入力して、Enterキーを押してください。


echo "Hello    World"

 

以下のように空白が4つ連続で表示されます。 同じく空白を正しく表示させることができました。

taro@myhostname:~$ echo "Hello    World"
Hello    World
taro@myhostname:~$

このように "(二重引用符) で囲むことでも1つの引数だと解釈させることができます

ということは '(引用符) と "(二重引用符) は同じ意味なのでしょうか。 いえ、ちょっと違います

"(二重引用符) で囲まれた部分の変数参照は展開されますが、'(引用符) で囲まれた部分の変数参照は展開されません

言葉で説明するのは難しいので実際にやってみましょう。 キーボードから MYNAME=yamada ; echo "$MYNAME" と入力して、Enterキーを押してください。


MYNAME=yamada ; echo "$MYNAME"

 

以下のように変数 MYNAME の中身が表示されます。

taro@myhostname:~$ MYNAME=yamada ; echo "$MYNAME"
yamada
taro@myhostname:~$

このように "(二重引用符) で囲まれた変数参照は正しく展開されます

続いては、'(引用符) で囲んだ場合です。 キーボードから MYNAME=yamada ; echo '$MYNAME' と入力して、Enterキーを押してください。


MYNAME=yamada ; echo '$MYNAME'

 

以下のように変数 MYNAME は展開されません

taro@myhostname:~$ MYNAME=yamada ; echo '$MYNAME'
$MYNAME
taro@myhostname:~$

このように '(引用符) で囲まれた変数参照は展開されません。 逆に言えば、$(ドル記号)で始まるテキストは '(引用符) で囲まなければ展開されてしまう、ということです。

'(引用符) や "(二重引用符) そのものを表示させるには

連続する2つ以上の空白を表示するには '(引用符) または "(二重引用符) で囲めばいいことがわかりました。 では '(引用符) や "(二重引用符) そのものを表示するにはどうすればいいのでしょうか

'(引用符) そのものを表示する場合は '(引用符) を "(二重引用符) で囲みましょう。 キーボードから echo "'" と入力して、Enterキーを押してください。


echo "'"

 

以下のように '(引用符) を表示することができます。

taro@myhostname:~$ echo "'"
'
taro@myhostname:~$

では、次は "(二重引用符) を表示する場合です。 みなさんの予想通り '(引用符) で囲めばいいだけです。 キーボードから echo '"' と入力して、Enterキーを押してください。


echo '"'

 

以下のように "(二重引用符) を表示することができます。

taro@myhostname:~$ echo '"'
"
taro@myhostname:~$

このように '(引用符) そのものを表示する場合は "(二重引用符) で囲み、"(二重引用符) そのものを表示する場合は '(引用符) で囲みましょう。

エスケープ処理で '(引用符) や "(二重引用符) そのものを表示させる方法もある

上で説明した以外にも '(引用符) や "(二重引用符) そのものを表示させる方法があります。 それは "エスケープ処理" と呼ばれるものです。

エスケープ処理とは "エスケープ文字に続く1文字は特別な意味を失う" という記述方法です。 エスケープ文字を記述すると、その後ろの1文字がただの文字になるのです

では、エスケープ文字とはどんな文字なのでしょうか。 それは \(バックスラッシュ) です。

  
\ はバックスラッシュです。 バックスラッシュはUNIX系OSでは \(バックスラッシュ) として正しく表示されますが、Windows では ¥(円マーク) として表示されます。 どちらにしても、日本語キーボードからは ¥(円マーク) で入力します。
  
ウェブ上でのバックスラッシュの表示は、ウェブブラウザによって異なります。 \(バックスラッシュ) として表示するものもあれば ¥(円マーク) として表示されるものもあります。

では、やってみましょう、まずは '(引用符) の表示からです。 キーボードから echo \' と入力して、Enterキーを押してください。


echo \'

 

以下のように '(引用符) を表示することができます。

taro@myhostname:~$ echo \'
'
taro@myhostname:~$

'(引用符) の本来の意味は "クォーティング" ですが、その前に \(バックスラッシュ) を付与したことでその意味を失いました。 文字としての '(引用符) となったのです。

  
echo コマンドの表示結果に \(バックスラッシュ) は現れていません。 \(バックスラッシュ) は後ろに続く1文字を "ただの文字にする" という役割を持ちます。 つまり、\(バックスラッシュ) は文字としては扱われません。

続いては "(二重引用符) を表示してみましょう。 キーボードから echo \" と入力して、Enterキーを押してください。


echo \"

 

以下のように "(二重引用符) が表示されます。

taro@myhostname:~$ echo \"
"
taro@myhostname:~$

このように \(バックスラッシュ) に続く1文字は本来の意味を失います。

では \(バックスラッシュ) はどう表示させればいいのか

\(バックスラッシュ) を記述することで、次の1文字の本体の意味を打ち消せることがわかりました。 では、\(バックスラッシュ) そのものを表示させるにはどうすればいいのでしょうか。

\(バックスラッシュ) は次の1文字の本体の意味を失わせます。 つまり、\(バックスラッシュ) を2つ連続して記述すれば、2つ目の \(バックスラッシュ) はただの文字になります。

では、やってみましょう。 キーボードから echo \\ と入力して、Enterキーを押してください。


echo \\

 

以下のように \(バックスラッシュ) を表示することができます。

taro@myhostname:~$ echo \\
\
taro@myhostname:~$

このように \(バックスラッシュ) を2つ連続して記述することで文字としての \(バックスラッシュ) を表現することができます。

  
  

まとめ

シェルは、空白をコマンドや引数の区切りとみなします。 そのため、

echo Hello    World

という命令は以下のように解釈されます。

コマンド echo
引数1 Hello
引数2 World

そのような解釈を避けるためには、

echo 'Hello    World'

のように '(引用符) で引数を囲みます。 また "(二重引用符) で囲んでも同様の結果が得られます。

ただし '(引用符) と "(二重引用符) では意味が少し異なります。 "(二重引用符) で囲まれた部分の変数参照は展開されますが、'(引用符) で囲まれた部分の変数参照は展開されません。

なお '(引用符) そのものを表示する場合は "(二重引用符) で囲み、"(二重引用符) そのものを表示する場合は '(引用符) で囲みます。

表記 説明
"'" '(引用符) を表す
'"' "(二重引用符) を表す

'(引用符) や "(二重引用符) そのものを表示させる別の方法として、\(バックスラッシュ) でエスケープ処理するという手もあります。

表記 説明
\' '(引用符) を表す
\" "(二重引用符) を表す

\(バックスラッシュ) を2つ連続して記述することで、\(バックスラッシュ) そのものを表現することもできます。

表記 説明
\\ \(バックスラッシュ) を表す
メニュー