バックスラッシュはどんな場合にエスケープ文字として解釈されるか

Bashエスケープエスケープシーケンス

シェルスクリプトを書いてると、いつの間にか\が一本無くなってたり、エスケープが上手くいかなかったりして混乱するので、バックスラッシュがどのような場合にエスケープ文字として解釈されるかまとめてみました。

注意

完全な内容ではないです。
ユーザーコマンドはGNU版です。

bash自身

行末にある場合は行の継続として解釈する。それ以外はそれに続く文字として解釈する。(ちなみにこのバックスラッシュは後述のシングルクォート、ダブルクォートと並ぶクォートの一種)

$ \echo delta
delta
$ \\echo delta
コマンド '\echo' は見つかりませんでした。もしかして:
 コマンド 'aecho' - パッケージ 'netatalk' (universe)
 コマンド 'echo' - パッケージ 'coreutils' (main)
\echo: コマンドが見つかりません
$ echo \
> delta
delta

echo自身後で説明するので、循環参照っぽい例になってますが勘弁してください。

シングルクォート

エスケープ文字として解釈しない。(∴シングルクォートの中にシングルクォートを置くことはできない?)

$ echo '\\'
\\

ダブルクォート

エスケープ文字として解釈する。ただし後続の文字が$`"\, 及び改行の場合に限る。

$ echo "\\\$\tEOT"
\$\tEOT # \tはタブではない

ヒアドキュメント

テキスト終端記号がクォートされているかどうかで挙動が変わる。クォートされていない場合はエスケープ文字として解釈する。ただし後続の文字は$`\であり、改行が続く場合は無視される。

$ cat <<EOF
> \\
> \$
> \t
> \
> EOF
\
$
\t
$ cat <<"EOF"
> \\
> \
> EOF
\\
\

コマンド

凡例

項目意味
デフォルトYes/Noデフォルトでバックスラッシュをエスケープ文字として解釈するか
反転オプションオプション文字列動作を反転させるオプション
後続文字文字のリストバックスラッシュの後に置いた時に特別に解釈される文字

後続文字の意味などはマニュアルを参照のこと。マニュアルなどで確認できない場合は項目自体なし。

read

デフォルト:Yes
反転オプション:-r

$ read line; echo $line
\\ # 入力
\
$ read -r line; echo $line
\\ # 入力
\\

echo(組み込み / 外部)

デフォルト:No
反転オプション:-e
後続文字:\,a,b,c,e,f,n,r,t,v,0NNN,xHH,E(組み込み),uHHHH(組み込み),UHHHHHHHH(組み込み)

$ echo \ttest
ttest
$ echo -e \ttest
ttest # bash自身のエスケープ解釈
$ echo -e '\ttest'
    test
$ echo '\j'
\j

ちなみに-Eでエスケープシーケンスを解釈しないよう指示できる。zshのechoはデフォルトでエスケープシーケンスを解釈し、-Eで抑制できる(らしい)。

printf (組み込み / 外部)

エスケープ文字として解釈する。エスケープシーケンスはフォーマット文字列中に埋め込むこともできるし、%bによって引数文字列中のエスケープシーケンスを解釈するようにもできる。

$ printf '%s\t%b\n' 'abc\tdef' 'ghi\tjkl'
abc\tdef    ghi jkl

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中