シェル

シェルスクリプトのクォーテーションについて理解をまとめる

こんにちは、ともです。

シェルスクリプトを勉強中でして、この記事ではクォーテーションについて理解をまとめたいと思います。

ダブル・シングルクォーテーション、バックスラッシュ、バッククォートについてまとめました。

参考にしたものは、

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

クォーテーション(引用符)とは

ディレクトリ内に次の3つのファイルが存在するとします。

  • abc
  • xyz
  • abc xyz

“abc xyz”という空白文字が存在するファイル名が存在します。

このディレクトリで”abc xyz”ファイルの詳細を見るためにls -l abc xyzとコマンドを入力したとします。

-rw-r--r--  1 user  staff  0  3  1 18:40 abc
-rw-r--r--  1 user  staff  0  3  1 18:40 xyz

ls -l abc xyzでは”abc”と”xyz”の2つのファイルだと解釈してしまいます。

このように、入力した文字列を意図したように解釈してもらうためにクォーテーションを利用することで、コマンド入力者が意図したようにシェルに伝えることができます。

今回の場合だとls -l "abc xyz"というダブルクォーテーションを利用することにより”abc xyz”で一つの文字列だと解釈させる必要があります。

特殊文字

特殊文字という文字が存在します。

; & ( ) | ^ < > ? * [ ] $ ‘ ” ` { } 改行 タブ スペース

上記が特殊文字で、普通の文字として扱う場合はクォーテーションを利用する必要があります。普通の文字として扱う場合はクォーテーションで囲む必要があります。

バックスラッシュ(\)

1文字をクォートするために\が利用できます。

echo abc\def
// Output:abcdef
// dをクォートして変化なし

echo abc\\def
// Output:abc\def
// \をクォート

バックスラッシュ(\)は1文字をクォートする特殊文字です。バックスラッシュ自信をクォートするには2つのバックスラッシュ(\\)となります。

シングルクォーテーション(’ ‘)

シングルクォーテーションは囲まれた文字列を普通の文字列として扱います。

シングルクォーテーションは一番強力なもので、全ての特殊文字をエスケープします。

ダブルクォーテーション(” “)

ダブルクォーテーションはほとんどの特殊文字をエスケープしますが、

$、バッククォート(`)、バックスラッシュ(\)

はエスケープすることができません。

もしダブルクォーテーション内で$、バッククォート(`)、バックスラッシュ(\)をクォートする場合はこれらの直前にバックスラッシュを利用します。

$ FOO=foo
$ echo $FOO
foo
$ echo "$FOO"
foo
$ echo "\$FOO"
$FOO

混同しないためにバッククォートも

バッククォートはエスケープ処理をする文字ではありません。

シングル・ダブルクォーテーションと似てる形が似てるのに・・・

形は似ているんですが機能が全く違うんです。

バッククォート

エスケープ処理とは機能が真逆で、バッククォートで囲まれた文字列をコマンドとして実行します。

$ echo "Today is date"
Today is date

$echo "Today is `date`"
Today is 2019年 3月 1日 金曜日 19時31分21秒 JST

`date`によりdateコマンドとして実行し展開していることが分かります。

まとめ

シェルのクォーテーションについて理解をまとめました。

  1. バックスラッシュ・・・1文字エスケープ
  2. シングルクォート・・・最強のエスケープ
  3. ダブルクォート・・・$、バッククォート、バックスラッシュ以外をエスケープ
  4. バッククォート・・・コマンドとして実行