本文へスキップ
BecomeCoder

シェルスクリプトコース · 第2章 変数とクォート · レッスン6

クォート ― " と ' の違いで結果が変わる

ブラウザで完結

導入

シェルスクリプトのバグの半分は、クォートが原因です。"' と「囲まない」で結果が変わることを、最初にきっちり体に入れておきましょう。ここを曖昧にしたまま先に進むと、あとで必ず遠回りします。

説明

囲み方は3つ。違いは 「中の $変数 を展開するか」「スペースで区切られるか」 です。

書き方$変数 の展開用途
"..."(二重引用符)される基本はこれ。値にスペースが入っても1つの値として扱える
'...'(単一引用符)されない$*文字そのものとして扱いたいとき
囲まないされる値にスペースがあると複数に割れてしまう(危険)
#!/bin/bash

name=太郎
message="こんにちは、世界"

echo "二重引用符: $name"
echo '単一引用符: $name'
echo "メッセージは $message です"

実行すると、二重引用符では 太郎 に化け、単一引用符では $name という文字がそのまま出ます。

囲まないと何が困るのか。スペースを含む値が、別々の引数に割れてしまうのです。

flowchart TD
    A["message=\"こんにちは 世界\""] --> B["echo $message<br/>(囲まない)"]
    A --> C["echo \"$message\"<br/>(囲む)"]
    B --> D["引数2つ: こんにちは / 世界"]
    C --> E["引数1つ: こんにちは 世界"]

echo では違いが見えにくいのですが、これがファイル名だと事故になります。rm $filefile="大事な メモ.txt" だったら、大事なメモ.txt の2つを消そうとします。

迷ったら二重引用符で囲む。これが唯一の正解に近いルールです。第7章でもう一度、この落とし穴を扱います。

やってみよう

3つの echo を実行して、"' の差を目で確かめてください。そのあと echo $messageecho "$message" の両方をエディタに足して実行し、囲まなくても echo なら同じに見えることも確認しましょう(見えないだけで、内部では割れています)。

演習

$name展開させずに$name という文字をそのまま画面に出してください。

ヒント1を見る

$ を文字として扱いたいときは単一引用符 ' で囲みます。

ヒント2を見る

echo '単一引用符: $name'

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。