背景
bashを書き始めたばかりの新米エンジニアです。コーディングしていて、
”あれ、ここシングルクォート?ダブル?そもそも囲う必要あるのかな?まぁ動けばなんでもいいか・・・”
という具合にいつも悩んでしまうので、改めて整理することにした。
結論
シングルクォート''
文字列をシングルクォートで囲むと、文字列中の各文字すべてが特殊な意味を失い、文字通りの意味として解釈される。
# $HOMEはシェルを実行中のユーザのホームディレクトリが設定されている特別なシェル変数$ echo'$HOME'# シングルクォートで囲む$HOME# そのまま$HOMEと出力される$ echo"$HOME"# ダブルクォートで囲む
/c/Users/guest.name # シェル変数の値に展開される$ echo'*'# シングルクォートで囲む*# そのまま*と出力される$ echo*# 何もクォートしない
bin doc src # カレントディレクリのファイル名に展開される
ダブルクォート""
文字列をダブルクォートで囲むと、シングルクォートとほぼ同様にほとんどの文字がその特殊な意味を失う。
しかし、\$と`の特殊な意味は残るため、パラメータ展開とコマンド置換は行われる。
予期せぬ挙動を防ぐために、"\$変数" や "\$(コマンド置換)" はダブルクォートで囲んだほうが良さそう。
# パラメータ展開$ var='*** hello world ***'# スペースの連続と*を含む文字列$ echo"$var"# ダブルクォートで囲む*** hello world ***# 正しく表示される$ echo$var# ダブルクォートで囲まない
bin doc src hello world bin doc src # スペースが区切り文字として解釈され、前後にカレントディレクトリのファイル名が展開される# コマンド置換$ user='$(whoami)'# シングルクォートで囲む$ echo"$user"$(whoami)# 単なる文字列として解釈されている$ user="$(whoami)"# ダブルクォートで囲む$ echo"$user"
guest.name # whoamiコマンドの結果が代入されている
バックスラッシュ\
文字の前にバックスラッシュををつけると、\の直後の1文字が特殊な意味を失い、文字通りの意味として解釈される。
$ echo\$HOME # $の前にバックスラッシュをつける$HOME# そのまま$HOMEと出力される$ echo$HOME# バックスラッシュをつけないと
/c/Users/guest.name # シェル変数の値に展開される$ echo\*# *の前にバックスラッシュをつける*# そのまま*と出力される$ echo*# バックスラッシュをつけないと
bin doc src # カレントディレクリのファイル名に展開される
参考文献:山森 丈範 『[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる』 技術評論社 (2018/11/14)