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

Pythonプロジェクトのdocstringの網羅率を計算するパッケージdoc-covをつくった

みんなのdocstring書くモチベーションをあげるために、docstringの網羅率を計算して Pull Requestごとにdocstringの網羅率(coverage)の変化を表示したいな〜と思って調べたんですが、 そういった網羅率を計算するライブラリが見つけられなかったので、自分で作りました。

インストールの仕方と使い方を紹介します。

インストール

pip install doc-cov

これでdoccovコマンドが使えるようになります。

使い方

基本的には計算したいプロジェクトのパスを指定するだけ。 デフォルトではpublicな関数のdocstringの網羅率が出力されます。

$ doccov tests/sample_project

function     3 /   5 60.00%

Options

細かいオプションはREADMEにありますが、 いくつか例を出しておきます。

csv出力

$ doccov tests/sample_project --output csv

coverage,function,3,5,60.00%

関数だけでなくクラス・モジュールのcoverageも出力

doccov tests/sample_project -fmc

class        2 /   2 100.00%
module       3 /   7 42.86%
function     3 /   5 60.00%

モジュールごとにドキュメント網羅率を表示

$ doccov tests/sample_project --all

=============================
module_fulldoc
-----------------------------
function     1 /   1 100.00%
=============================
package_A
-----------------------------
function     0 /   0 -
=============================
package_A.module_fulldoc
-----------------------------
function     1 /   1 100.00%
=============================
package_B
-----------------------------
function     0 /   0 -
=============================
package_B.module_shortdoc
-----------------------------
function     1 /   1 100.00%
=============================
package_B.package_B_1
-----------------------------
function     0 /   0 -
=============================
package_B.package_B_1.module_nodoc
-----------------------------
function     0 /   2 0.00%
=============================
coverage
-----------------------------
function     3 /   5 60.00%

pypi

pypi.org

pythonの標準で準備されているドキュメント生成モジュールのpydocの実装をごにょっとして作りました。会社や趣味のプロダクトのドキュメント網羅率を可視化してドキュメントモチベーションをあげるのに使ってください。

網羅率は計算できるようになったので、次はapiドキュメントをdocstringからいい感じに自動生成するやつを作ります〜。