シェルは実行する前に書き換えている。引用符を付ける理由を図にした
打った文字列はそのまま渡りません。決まった順番で展開されてから実行されます。変数を引用符で囲む理由は、この順番の3番目にあります。

この記事の結論
- 打った文字列はそのまま渡らない。順番に展開されてから実行される
- 語の数が増えるのは3つの展開だけ
- 変数を引用符で囲む理由は、そのうちの1つを止めるため
- 打った文字列はそのまま渡らない。順番に展開されてから実行される
- 語の数が増えるのは3つの展開だけ
- 変数を引用符で囲む理由は、そのうちの1つを止めるため
変数を引用符で囲むのは「お作法」だと思っていた。展開の順番を知ったら、囲まないと壊れる理由がはっきりした。

順番は決まっている
手引きには、この順で行うと書かれている。
- 波括弧の展開
- チルダの展開、変数の展開、計算の展開、コマンド置換(左から右へ)
- 語の分割
- ファイル名の展開
- 引用符の除去
注目すべきは2と3の順番になる。変数が値に変わったあとで、語の分割が行われる。
ここが分かると、原因が見える
変数の中身に空白が入っていた場合、値になった時点では1つでも、次の段階で別々の語に割れる。
手引きはこう書いている。
シェルは、二重引用符の中で起きなかった変数の展開、コマンド置換、計算の展開の結果を走査して、語の分割を行う。
区切りに使われる文字は IFS で決まり、既定では空白・タブ・改行になる。
語の数が増えるのは3つだけ
手引きの、もう一つ重要な一文がこれになる。
波括弧の展開、語の分割、ファイル名の展開だけが展開結果の語の数を増やせる。その他の展開は、1つの語を1つの語に展開する。
つまり事故の原因は、この3つのどれかに絞られる。変数を使って意図しない動きになったときは、まずここを疑えばいい。
実際に起きること
ファイル名に空白が入っているときが、いちばん分かりやすい。
| 書き方 | 渡るもの | 結果 |
|---|---|---|
rm $f | 2つの語(空白で割れる) | 別々の名前として扱われ、見つからない |
rm "$f" | 1つの語のまま | 意図どおりに動く |
出るのは「ファイルがありません」というメッセージになる。名前は合っているのに見つからないので、原因を探す方向がずれやすい。
囲むと何が止まるか
二重引用符で囲むと、語の分割とファイル名の展開が行われない。変数の展開そのものは行われるので、値は入る。
止めたいのは3と4であって、2ではない。必要な展開は残したまま、増える展開だけを止めるのが二重引用符の役割になる。
一重と二重の違い
一重引用符で囲むと、変数の展開も止まる。中身がそのまま文字列として渡る。
だから使い分けは単純になる。値を入れたいなら二重、入れたくないなら一重。迷ったら二重から始めればいい。
コマンド置換のときも同じ
別のコマンドの出力を受け取るときにも、同じことが起きる。
出力に空白や改行が含まれていれば、その位置で語に割れる。ファイルの一覧を受け取る処理で、名前に空白が入った瞬間に崩れるのは、これが理由になる。
展開の順番でいえば、コマンド置換は2番目、語の分割は3番目になる。出力が入ったあとに割られるので、出力側をどれだけ整えても防げない。
行ごとに扱いたいとき
一覧を1件ずつ処理したいなら、語の分割に任せない。区切りを自分で決めて、1行ずつ読む形にする。
空白で割れてほしいのか、改行で割れてほしいのかは、処理ごとに違う。既定の区切りは空白・タブ・改行の3つなので、何もしなければ空白でも割れる。ここが食い違いの正体になる。
決めている書き方
手で打つときはともかく、手順として残す文章では次のようにしている。
- 変数を書くときは、必ず二重引用符で囲む
- 囲まないのは、意図して語に割りたいときだけ。そのときは理由を書き添える
- ファイル名を扱う処理は、空白入りの名前で一度試す
3番目が効く。空白の入ったファイルを1つ作って通してみるだけで、この種の不具合は事前に出る。
結果を次の処理に渡すときの注意はgrepは行ごとに見ているだけにも書いた。終わったときの番号と、語の分割が、手順を書くときの二大つまずきになる。
まとめ
- 展開の順番は波括弧 → 変数など → 語の分割 → ファイル名 → 引用符の除去
- 変数が値になったあとで、語の分割が起きる
- 区切りは
IFSで決まり、既定は空白・タブ・改行 - 語の数を増やせるのは3つの展開だけ。事故はここに絞られる
- 二重引用符は語の分割とファイル名の展開だけを止める
- 一重引用符は変数の展開も止める
出典
- GNU Bash 公式マニュアル(展開の順番、語の数を増やせる3つの展開。2026年10月13日に確認)
- 同「Word Splitting」(二重引用符の外で起きた展開だけが走査されること、
IFSの役割)
図は本記事のために作成したもの。
新しい記事が出たら、ブラウザの通知でお知らせします。
メールアドレスの登録は要りません。いつでも止められます。
関連記事
RELATED
圧縮できるのは、冗長度があるから。情報の量の測り方を図にした
情報の量は意味では測りません。どれだけ絞り込めたかで測ります。1948年の論文が置いた定義と、英語の冗長度が約50%とい…
HOKKAIDO AI LAB を英語でも読めるようにしました。ボタン1つで翻訳、英語のページを作らなかった理由も
海外から読んでくださる方のために、ヘッダーに英語の翻訳ボタンを付けました。押すと、いま見ているページがその場で英語になり…
相席か個室か。1つの仕組みを何社で使うかを図にした
共有するか分けるかは0か1ではありません。層ごとに決められます。4つの構成と、それぞれで何を引き受けることになるのかを整…