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

Shell Script Advent Calendar 2015 3日目の記事をqiitaから移動したものです。

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

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さんです。よろしくお願いします!