本記事では、シェルスクリプトにおける「シングルクォート、ダブルクォート、バッククォート」の違いについて解説していく。
クォートの種類と役割の違い
シェルスクリプトではクォートによって囲まれた中身の処理がそれぞれ異なる。
先に、クォートごとの処理内容についてまとめると以下のようになる。
シングルクォート 「’」 | 内容を文字列として出力 |
ダブルクォート 「”」 | 変数の内容を文字列として出力 |
バッククォート 「`」 | コマンドとして実行して結果を出力 |
シングルクォートの使用例
囲んだ中身をすべて文字列として使用したい場合に「’」シングルクォートを使用する。
シングルクォートで囲った場合は、たとえ中に変数があったとしても中身を展開することなく変数がそのまま文字列として処理されてしまう。
以下はシングルクォートの使用例。
#!/bin/bash
STRINGS='Hello World.'
echo '$STRINGS'
実行結果
$STRINGS
変数「STRINGS」に格納された「Hello World.」という文字列だが、変数である「$STRINGS」をシングルクォートで囲ってしまっているため、中身が展開されずにそのまま「$STRINGS」が文字列として処理されて出力されているのが分かるだろう。
シングルクォートで囲った中でシングルクォートを表示
下記のスクリプトのように、
シングルクォート内のシングルクォートはスクリプトを実行しても表示されない。
#!/bin/bash
echo 'Hello 'World''
実行結果
Hello World
スクリプト内では「World」の部分をシングルクォートで囲っているが出力結果には表示されていない。
上記から分かるように、シングルクォートの中ではシングルクォートをエスケープすることが出来ないため、表示させるためには少し工夫が必要となる。
「Hello ‘World’」という文字列を表示させたい場合は、「’Hello ‘」(Helloを出力) + 「\’」(’を出力)+「’World’」(Worldを出力)+「\`」(’を出力)といった具合に、シングルクォートを一度閉じてから「\’」でシングルクォートをエスケープして出力させるという方法取る必要がある。
#!/bin/bash
echo 'Hello '\''World'\'
実行結果
Hello 'World'
これでシングルクォートが表示されるようになった。
ダブルクォートの使用例
ダブルクォートは囲った中身に変数がある場合はその中身を展開してくれるので、変数の中身を展開して表示させたい場合に使用する。
下記のようなシェルスクリプトを作成して実際に実行してみます。
#!/bin/bash
STRINGS='Hello World.'
echo "$STRINGS"
実行結果
Hello World.
シングルクォートと違い、今回は「$STRINGS」をダブルクォートで囲っているため、変数の中身が展開され事前に格納されていた「Hello World.」という文字列が表示された。
バッククォートの使用例
バッククォートはシェルスクリプトの中でコマンドを実行させたい場合に使用する。
「date」コマンドで現在の日時を取得して表示させるスクリプトを作成して、実際に実行してみる。
#!/bin/bash
echo "今の日時は`date`です。"
実行結果
今の日時は2022年 10月 2日 日曜日 10:14:21 JSTです。
「date」コマンドがスクリプト実行時の日時を取得してその結果を表示しているのが分かる。
バッククォートを上からシングルクォートで囲ってみる
バッククォートで囲まれているものを、さらにシングルクォートで囲んでしまうと、コマンドは実行されずに「`date`」という文字列として処理されてしまうので注意が必要だ。
バッククォートをシングルクォートで囲んだスクリプトを作成して実行してみる。
#!/bin/bash
echo '今の日時は`date`です。'
実行結果
今の日時は`date`です。
「`date`」の部分が文字列としてそのまま表示されてしまった。
バッククォート内のコマンドを間違った場合
バッククォートで囲ったコマンドに間違いがあった場合は、エラーとして表示される。
わざと「date」を「data」と変更してスクリプトを作成し実行してみる。
#!/bin/bash
echo "今の日時は`data`です"。
実行結果
./test.sh: 行 2: data: コマンドが見つかりません
今の日時はです。
「 data: コマンドが見つかりません」とエラーが表示される。
シングルクォートとダブルクォートの使い分け
各クォートの使い分け方としては、以下の様にするのがおすすめだ。
- 通常はシングルクォートを使用する。
- 変数の展開やコマンドの実行結果を表示させたい場合にダブルクォートを使う
関連記事
https://qiita.com/Riliumph/items/97d9f0ae2eb2d7aae587