Non-modern Shell Programing (2)

書く気力が失せたので、SUSv4のShell Command Languageの翻訳でお茶を濁すことにする。基本的に直訳なので翻訳の質についてはご容赦。

2.2 クォート

クォートは、ある文字群や単語のシェルにとって特別な意味を除去するために用いる。クォートは、次の段落に示す特別な文字の字義通りの意味を保ったり、予約語予約語として認識されることをさまたげたり、ヒアドキュメントの処理内でパラメータ展開やコマンド置換をさまたげるために用いることができる。

以下の文字群それ自体を表現したいならば、アプリケーションはそれらをクォートするものとする。

| & ; < > ( ) $ ` \ " ' <空白> <タブ> <改行>

また、以下はある状況の下ではクォートする必要があるかもしれない。POSIX.1-2008のこの巻のどこかで述べられている条件により、これらの文字は特別になるかもしれない。

* ?[ # ~ = %

エスケープ文字とシングルクォートとダブルクォートいうさまざまなクォート機構がある。ヒアドキュメントはクォートのまた別の形式を表現する。

2.2.1 エスケープ文字(バックスラッシュ)

クォートされていない<バックスラッシュ>は、<改行>を除いて、続く文字の字義通りの意味を保つ。<改行> が<バックスラッシュ>に続く場合、シェルは行が継続していると解釈するものとする。<バックスラッシュ>と<改行>は入力をトークンに分割する前に除去されるものとする。エスケープされた<改行>は入力から完全に削除され、空白に置換されないので、トークンのセパレータとして振る舞うことはできない。

2.2.2 シングルクォート

シングルクォート('')で囲んだ文字群は、シングルクォート内のそれぞれの文字の字義的な意味を保つものとする。シングルクォートはシングルクォート内に現れられない。

2.2.3 ダブルクォート

ダブルクォート("")で囲んだ文字群は、下記に示すように、バッククォートと<ドル記号>と<バックスラッシュ>という文字群を除き、ダブルクォート内のすべての文字群の字義通りの意味を保つものとする。

$

<ドル記号>はパラメータ展開やコマンド置換の形式の1つや算術展開を開始するという特別な意味を保つものとする。

クォートされた文字列内の入力文字群は、"$("とそれにマッチする')'で囲まれていたら、ダブルクォートの影響を受けるのではなく、単語が展開される時にその出力で"$(...)"を置き換えるコマンドを定義するものとする。トークン認識のトークン化規則は、エイリアス置換のエイリアス置換を除いて、マッチする')'を再帰的に検索するように適用されるものとする。

"${"とそれにマッチする'}'で囲んだ文字群からなる文字列内では、もしあるとしたら偶数個の非エスケープのダブルクォートやシングルクォートが存在するものとする。先行する<バックスラッシュ>文字は'{'や'}'というリテラルエスケープするために用いられるものとする。パラメータ展開の規則がマッチする'}'を決定するために用いられるものとする。

`

バッククォートはコマンド置換の形式のもう1つを開始するという特別な意味を保つ。最初のバッククォートと、<バックスラッシュ>によって先行されていない次のバッククォートまでの文字群からなる、クォートされていない文字列の部分は、エスケープされた文字列を取り除いてから、単語が展開される時にその出力で"`...`"を置き換えるコマンドを定義する。下記のいずれかの場合は未定義の結果を引き起こす。

  • "`...`"内において、開始されるが終端しないシングルクォートまたはダブルクォート文字列
  • 同じダブルクォート文字列内において、開始するが終了しない"`...`"列

\

特別と見なされる下記の文字群の1つが続く時にのみ、<バックスラッシュ>はエスケープ文字として特別な意味を保つ。

$ ` " \ <改行>

アプリケーションはダブルクォート内に含まれるダブルクォートが<バックスラッシュ>によって先行されることを保証するものとする。'@'パラメータは特殊パラメータに述べられているように、ダブルクォート内でも特別な意味を持つ。

SUSv4 - Shell Command Language - 2.2 Quoting