| author | プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com> | |
|---|---|---|
| created | 2026-07-23 | |
| draft | true | |
| tags |
|
|
| title | Bash 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 関係の仕様は観察しない。
以上