目次
こんにちは、ともです。
シェルスクリプトを勉強中でして、この記事ではクォーテーションについて理解をまとめたいと思います。
ダブル・シングルクォーテーション、バックスラッシュ、バッククォートについてまとめました。
参考にしたものは、
入門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文字エスケープ
- シングルクォート・・・最強のエスケープ
- ダブルクォート・・・$、バッククォート、バックスラッシュ以外をエスケープ
- バッククォート・・・コマンドとして実行