LoginSignup
9
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-11

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

注意

完全な内容ではないです。
ユーザーコマンドは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
9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9