シェルが文字として認識するために引用符をつけるべき文字は
1 |
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline> |
になり、さらに特別な状況下では追加で
1 |
* ? [ # ˜ = % |
に対して必要になります。
エスケープ文字
エスケープ文字にはバックスラッシュ(\)を使います。
引用符で囲まれていない<backslash>はすぐ後の文字のリテラル値を保持します。
1 2 3 4 |
$ echo \| | $ echo \& & |
シェルでは<backslash><newline>は特別な意味を持ち、行の継続を意味します。
<backslash><newline>は入力をトークンに分割する前に削除されます。
1 2 3 |
$ echo 'abc'\ > 'de' abcde |
シングルクォーテーション
シングルクォーテーションはシングルクォーテーション内の各文字のリテラル値を保持します。
1 2 |
$ echo '| & ; < >' | & ; < > |
シングルクォーテーション内でシングルクォーテーションを入れることはできません。
ダブルクォーテーション
ダブルクォーテーションは
- バッククォート
- ドル記号($)
- バックスラッシュ(\)
以外の文字のリテラル値を保持します。
バッククォートはコマンド置換に利用されます。
ドル記号はパラメータ展開、コマンド置換、算術展開に利用されます。
1 2 3 4 |
$ echo "`echo abc`" abc $ echo "${var:-aaa} $(echo abc) $((1+1))" aaa abc 2 |
バックスラッシュが機能するのは
1 |
$ ` " \ <newline> |
になります。
1 2 3 4 5 |
$ echo "\a \" \\ \` \$" \a " \ ` $ $ echo "abc\ > de" abcde |
テキストをトークンに分割するルール
- 入力の終了が認識されたら、現在のトークン(あれば)は区切られます。
- 直前の文字が演算子の一部で、かつ現在の文字がクォートされておらず、演算子を形成できる場合、それは演算子の一部として使用されます。
- 直前の文字が演算子の一部で、現在の文字を演算子と組み合わせて形成できない場合、前の演算子は区切られます。
- 特定の文字(バックスラッシュ、シングルクォート、ダブルクォート)はクォートの影響を与え、クォートされたテキストの終わりまでの後続の文字に影響を与えます。
- '$' やバッククォートのような文字が登場すると、シェルはそれらを特定し、展開するためのルールが適用されます。
- クォートされていない場合で新しい演算子の最初の文字として使用できる場合、現在のトークン(あれば)は区切られ、新しい演算子の開始として使われます。
- クォートされていないスペースはトークンの区切りとなり、スペースは削除されます。
- 直前の文字が単語の一部である場合、現在の文字はその単語に追加されます。
- '#' が登場すると、それと次の行末までの文字はコメントとして無視されます。
- 現在の文字は新しい単語の開始として使用されます。