シェルスクリプトでHTMLエスケープ

PHPPerlでのHTMLエスケープの話はよく目にするけど、そういえばシェルスクリプトでは見かけないなあ、なんて思った次第でございます。

動的Webコンテンツの先駆けであるCGIの普及期でさえ言語としてPerlが大々的に使われていたわけで、そもそもサーバサイドの言語としてシェルスクリプトが使われる機会は圧倒的に少ない。となればシェルスクリプトでのHTMLエスケープネタが見つからないのも当たり前というもの。

しかし無いとかえって作りたくなるもので、変換元テキストがUTF-8であるという前提で、試しにシェルスクリプトで最小限のHTMLエスケープを実装してみることにした。

まずはHTMLエスケープ処理の本体。escape-htmlという名前だ。

#!/bin/sh

PATH=/bin:/usr/bin

exec sed 's/&/\&/g
          s/</\&lt;/g
          s/>/\&gt;/g
          s/"/\&quot;/g
          s/'"'"'/\&apos;/g' ${@+"$@"}

標準入力ないし引数指定したファイルに対して最小限のHTMLエスケープを行い、標準出力に書き出す。この出力結果は、HTML要素の内容(Content)ないし属性値としてのみ使用できる(ただし属性値として使用する場合は前後をクォート文字で囲むこと)。

escape-htmlを元に、echo(1)ライクに引数の文字列に対してHTMLエスケープを行うシェルスクリプトを書くと、こんな感じだろうか?

#!/bin/sh

exec echo ${@+"$@"} | escape-html

引数を全てそのままechoに渡しているので、オプション `-n' で末尾の改行を付加しないスタイルになることが多いと思う。

とりあえず作ってみたけど、果たして需要はあるのだろうか?

終わりに

最終的には、こんな感じになった。