server-memo.net

【シェルスクリプト】クォートの使い分け方

   

これまではなんか適当に使っていたので改めて調べてみました。

クォートの種類

シェルスクリプトではクォートによって囲まれた中身の処理がそれぞれ異なります。
そこで、クォートごとの処理内容についてまとめてみました。

  • シングルクォート 「'」 内容を文字列として出力
  • ダブルクォート  「"」 変数の内容を文字列として出力
  • バッククォート  「`」 コマンドとして実行して結果を出力

シングルクォート

囲んだ中身をすべて文字列として使用したい場合に「'」シングルクォートを使用します。

シングルクォートで囲った場合は、たとえ中に変数があったとしても中身を展開することなく変数がそのまま文字列として処理されてしまします。

では、実際にシェルスクリプトを作成して実行してみます。

#!/bin/bash
STRINGS='Hello World.'

echo '$STRINGS'

変数「STRINGS」に「Hello World.」という文字列を格納してechoで表示させているだけですが、変数である「$STRINGS」をシングルクォートで囲っているため、中身が展開されずにそのまま「$STRINGS」が文字列として処理されて出力されています。

$ sh ./single-quart.sh
$STRINGS

シングルクォートで囲った中でシングルクォートを表示

シングルクォートの中ではシングルクォートをエスケープすることが出来ないため、表示させるためには工夫が必要となります。

下記のスクリプトのように、シングルクォート内のシングルクォートはスクリプトを実行しても表示されません。

#!/bin/bash
echo 'Hello 'World''

スクリプト内では「World」の部分をシングルクォートで囲っているのですが出力結果には表示されていません。

$ sh ./single-quart_2.sh
Hello World

「Hello 'World'」という文字列を表示させたい場合は、「'Hello '」(Helloを出力) + 「\'」('を出力)+「'World'」(Worldを出力)+「\`」('を出力)といった具合に、シングルクォートを一度閉じてから「\'」でシングルクォートをエスケープして出力させるという方法取る必要があります。

#!/bin/bash
echo 'Hello '\''World'\'

これでシングルクォートが表示されるようになりました。

$ sh ./single-quart_3.sh
Hello 'World'

ダブルクォート

ダブルクォートは囲った中身に変数がある場合はその中身を展開してくれるので、変数の中身を展開して表示させたい場合に使用します。

下記のようなシェルスクリプトを作成して実際に実行してみます。

#!/bin/bash
STRINGS='Hello World.'

echo "$STRINGS"

今回は「$STRINGS」をダブルクォートで囲っているため、変数の中身が展開され事前に格納されていた「Hello World.」という文字列が表示されました。

$ sh ./dobule-quart.sh
Hello World.

バッククォート

バッククォートはシェルスクリプトの中でコマンドを実行させたい場合に使用します。

「date」コマンドで現在の日時を取得して表示させるスクリプトを作成して、実際に実行してみます。

#!/bin/bash

echo "今の日時は`date`です。"

「date」コマンドがスクリプト実行時の日時を取得してその結果を表示しています。

$ sh ./back-quart.sh
今の日時は2017年  6月 19日 月曜日 10:14:21 JSTです。

シングルクォートで囲ってみる

バッククォートで囲まれているものを、さらにシングルクォートで囲んでしまうと、コマンドは実行されずに「`date`」という文字列として処理されてしまいますので注意が必要です。

バッククォートをシングルクォートで囲んだスクリプトを作成して実行してみます。

#!/bin/bash

echo '今の日時は`date`です。'

「`date`」の部分が文字列としてそのまま表示されてしまいました。

$ sh ./back-quart_2.sh
今の日時は`date`です。

バッククォート内のコマンドを間違った場合

バッククォートで囲ったコマンドに間違いがあった場合は、エラーとして表示されます。

わざと「date」を「data」と変更してスクリプトを作成し実行してみます。

#!/bin/bash

echo "今の日時は`data`です"。

「 data: コマンドが見つかりません」とエラーが表示されます。

$ sh ./back-quart_3.sh
./back-quart_3.sh: 行 3: data: コマンドが見つかりません
今の日時はです。

シングルクォートとダブルクォートの使い分け

私の場合、通常はシングルクォートを使用して、変数の展開やコマンドの実行結果を表示させたい場合にダブルクォートを使うという形を取るようにしています。

 - シェルスクリプト