Edited at

ShellScriptのダブルクォートとシングルクォートの違い

More than 3 years have passed since last update.

Shell Script Advent Calendar 2015 3日目の記事です。

この記事では自分が最近はまったシェルスクリプトの初歩の初歩、シングルクォート(')とダブルクォート(")の違いを紹介できればと思います。

C言語とかを書いてたら、シングルクォート(')とダブルクォート(")は違うのは当たり前なわけですが、最近JavaScriptやPythonばかり書いてたので、当然(')と(")は同じものだと脳みそが思い込んでてはまってしまいました。


ShellScriptでのクォートの基本の使い方

とある"Program Files"というセンスのない名前のフォルダがあったときに、

cd Program Files

これだとcdは引数が2つあると思って、Program Filesには移動できないので、

cd "Program Files"

とか、

cd 'Program Files'

と書いてあげたりするのが、1番普通の使い方ですね。


文字列が変数や式を含む場合

HELLO="Hello, world."

echo "Double quote: ${HELLO}"
echo 'Single quote: ${HELLO}'

こんなスクリプトを実行した時、結果は以下のようになります。

Double quote: Hello, world.

Single quote: ${HELLO}

ダブルクォートの中の変数や式は展開されるのに対して、シングルクォートは展開されません。

式を入れても同様です。

echo "Double quote: current directory : $(pwd)"

echo 'Single quote: current directory : $(pwd)'

Double quote: current directory : /Users/cocodrips/Program Files

Single quote: current directory : $(pwd)


エスケープのしかた


ダブルクォート(")の場合

ダブルクォート自体は、普通にバックスラッシュ(\)でエスケープできます。

echo "echo \"Hello, world\!\"" # echo "Hello, world!"

ただし、ダブルクォート(")の中の文字列は、制御文字をいちいちエスケープしてあげなければいけません。

例えば上の例の場合は、「!」はエスケープする必要があります。

(Hello, world!さえ簡単にさせてくれないなんて、ShellScript、なんて恐ろしい子・・・。)


シングルクォート(')の場合

シングルクォートはShellScriptの中でなんでも囲めちゃう強いやつです。

シングルクォートなら!の前にも"の前にもバックスラッシュ(\)は要りません。

echo 'echo "Hello, world!"' # echo "Hello, world!"

でもでも、シングルクォートは、シングルクォートの中では エスケープできません

シングルクォートをエスケープしたいときって、あまりないとは思うんですけど、それでもどうしてもやりたいときは有るわけです。あったんです。

そんな時は、こんな風にしてシングルクォートを一度終了させ、ダブルクォートでシングルクォートを囲んで出力する、というややっこしいことをするとできます。

echo 'echo '"'"'Hello, world!'"'" # echo 'Hello, world!'

書いてて何が何だか・・・???ってなるので、これはあまり書かずに済むと嬉しいです。


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

ShellScriptでは、基本はシングルクォート(')で囲んで、

変数や式を展開したいときと、シングルクォートを出力したい時だけ、ダブルクォート(")で書くのが良さそうな気がします。


ひとこと

ShellScript頑張って勉強するぞー!ってツイートしてたらACに誘われて、

本当は地味にためてたshell-collectionリポジトリの内容を紹介しようと思っていたのですが、

大して内容がない感じになりそうだったのでやめました(´・ω・`)

ShellScript超初心者なので、おかしい点があればぜひコメントください!

明日は@yasuhirokiさんです。よろしくお願いします!