シェルスクリプトを書いてると、いつの間にか\
が一本無くなってたり、エスケープが上手くいかなかったりして混乱するので、バックスラッシュがどのような場合にエスケープ文字として解釈されるかまとめてみました。
注意
完全な内容ではないです。
ユーザーコマンドは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