Skip to content

Instantly share code, notes, and snippets.

@showa-yojyo
Created July 23, 2026 15:02
Show Gist options
  • Select an option

  • Save showa-yojyo/88f7f1b954b6ecb7013aeb347f22c68a to your computer and use it in GitHub Desktop.

Select an option

Save showa-yojyo/88f7f1b954b6ecb7013aeb347f22c68a to your computer and use it in GitHub Desktop.
WIP
author プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com>
created 2026-07-23
draft true
tags
bash
title Bash quoting ノート

Bash quoting ノート

Quoting

Bash で言う quoting とは、特定の文字や語における特別な意味を失わせるための指示方法のことだ。例えば次のことは quoting により実現する:

  • 特殊文字が引き起こす処理を阻止する
  • Bash キーワードを通常の語のように取り扱わせる
  • 引数展開や履歴展開を阻止する

具体的には Bash では次の総称として quoting と言っている:

  • 文字 \ を対象文字の左につける
  • 引用符で囲む
  • 二重引用符で囲む
  • 引用符で囲んだ文字列の左に文字 $ をつける

文字 \ を対象文字の左につける

裸の \ は Bash のエスケープ文字だ。直後の文字をリテラルとして扱う。

ただし、裸の行末における改行文字に対する \ エスケープは扱いが異なる(行継続として扱う)。

引用符で囲む

文字列を引用符で囲む (i.e. '...') と、引用符内の文字すべてがリテラルであることが維持される。

$ cd '~'
-bash: cd: ~: No such file or directory
$ echo '!!'
!!

引用符の間に単一引用符を記述することは不可能となる。文字 '' でエスケープしようとしてもダメだ。

二重引用符で囲む

文字列を二重引用符で囲む (i.e. "...") と、引用符内の文字すべてが例外文字を除きリテラルであることが維持される。例外文字とは次のものだ:

  • $
  • '
  • \
  • !: set -o history である場合

二重引用符は \ エスケープを施せば、二重引用符の中で引用符として扱える。

set -o history である場合、二重引用符の中に含まれる ! から始まる履歴指定パターンは履歴展開とみなされる。

  • ! の前に \ がある場合に、この \ は取り除かれない。
$ echo "\!!"
\!!
$ echo "!!"
$ echo "echo "\!!""

二重引用符に囲まれた $@$* の扱われ方については別ノートにまとめた。

引用符で囲んだ文字列の左に文字 $ をつける

$'...' 形式の文字列は引用符囲みとして扱われる。この文字列内の \ でエスケープされた文字は ANSI C 標準で規定されているとおりに置換される。 それゆえ、この形式の quoting を ANSI-C quoting と呼ぶ。展開結果は引用符で囲まれた文字列と考えることができる。

$ echo '----\n----'
----\n----
$ echo $'----\n----'
----
----

Tip

よく使うのは $'\t'$'\n' だろう。cut(1) の -d に渡す例をすぐに思いつく。

二重引用符で囲んだ文字列の左に文字 $ を対象文字列の左につける

本稿では gettext 関係の仕様は観察しない。


以上

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment