シェルスクリプトでのクォートの違い
シェルスクリプトでは文字列を扱うために3種類のクォート(シングルクォート、ダブルクォート、バッククォート)があり、それぞれ異なる役割を持ちます。それぞれの違いについてまとめます。
例えばクォートで囲った文字列を echo
で出力するシェルスクリプトでそれぞれの違いを見ていきます。
#!/bin/bash
DATE='date'
echo $DATE
echo '$DATE'
echo "$DATE"
echo `$DATE`
上記のシェルスクリプトはそれぞれどのような出力になるでしょうか。
それぞれ違いを見ていきます。
シングルクォート(')
シングルクォートで囲まれた文字列は単に普通の文字列として扱われます。したがって、書かれた文字列そのままです。
特殊文字(ダブルクォートやバッククォート、バックスラッシュなど)もエスケープされそのままで扱えます。
#!/bin/bash
DATE='date'
echo '$DATE'
このスクリプトは $DATE という文字列がそのまま出力されます。特に変数の内容が展開されたりしません。
このシングルクォートが文字列出力の一番基本的な使い方です。
ダブルクォート(")
ダブルクォートは文字列の中に $
で変数が参照されていれば、変数の内容を文字列内に展開します。
#!/bin/bash
DATE='date'
echo "$DATE"
よって上記スクリプトだと変数 $DATE
が展開されて1つの、date という文字列が出力されます。
ただし $
、`
(バッククォート)、\
(バックスラッシュ)はエスケープせず、特殊な扱いになります。そのまま扱う場合は \
(バックスラッシュ)でエスケープします。
$ echo "\$ \` \\"
$ ` \
${} を使う
もし変数の切れ目がわかりづらかったり、うまく分割できないときは ${変数名}
とすればカッコ内の文字列を変数名として参照して、その内容を埋め込めます。
#!/bin/bash
DATE='date'
echo "X${DATE}X"
変な例ですが、'X' の間に変数 $DATE
を埋め込む場合、${DATE}
とすることでうまく埋め込めます。単純に開発者目線でわかりやすくするためにかっこで括るのも便利です。
バッククォート(`)
バッククォートは少し特殊で、ダブルクォートのようにクォートで括られた文字列内にある変数を展開して1つの文字列にします。さらに変数展開して得られた文字列を1つのコマンドとして評価し、その結果を文字列として扱います。
#!/bin/bash
DATE=date
echo `$DATE`
したがって $DATE
は、変数 $DATE
を展開して得られた文字列 'date' をコマンドとして評価し、date
コマンドの実行結果の標準出力である現在日時が文字列として得られます。それが最終的に echo
されて表示されます。
上記スクリプトの実行結果は Sat Feb 20 22:09:03 JST 2021 のような現在日時の文字列が出力されます。
クォートを組み合わせてみる
例えば、ダブルクォートとバッククォートを組み合わせて使うこともできます。
#!/bin/bash
DATE=date
echo "$DATE コマンドの実行結果-> `$DATE`"
上記スクリプトの実行結果は以下の通りです。
$ bash my_script.sh
date コマンドの実行結果-> Sat Feb 20 22:21:58 JST 2021
最初の $DATE
はダブルクォートないの変数として展開されます。2つ目についてはバッククォートによって変数が展開されてから評価され、その結果が展開されます。
それぞれ別々の結果が1つの文字列内に展開されることがわかります。
以上。
コメントを書く