ShellScript

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

You can use Qiita more conveniently by logging in!
Article posting, slide mode, trend, stock, etc
What you can do with signing up
Why do not you register as a user and use Qiita more conveniently?
You seem to be reading articles frequently this month. You can use this function by logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away