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