head コマンドが作れるか? (1)

次なるコマンドとして、head コマンド (unixのhead相当;以下同) を作ろうとしてしばらく苦戦している。
ここに書きながら進めていきたいと思う。

まず cat コマンドのサブセットは比較的簡単に出来る。サブセットと言うのは、
(1) オプションなし
(2) 標準入力サポートなし
である。ファイルからの入力のみの機能だ。直感的には、こうなる。

@echo off
for %%F in (%*) do for /f "delims=" %%X in (%%F) do echo %%X

表示には、for /f の機能を使ったので、空行はスキップされる (see. for/?) が、ここでは一旦、空行がスキップされてもまあいいとしよう。

ただし、上記だと、引数が " で囲まれていた場合、内側の for が文字列指定とみなされるためうまくない。次のようにすれば " で囲まれても大丈夫だ。一旦、%%~F" を外して囲みなおすことで、必ず一重の " に囲まれた状態となり、usebackq オプションでそれをファイル指定とみなす。

@echo off
for %%F in (%*) do for /f "usebackq delims=" %%X in ("%%~F") do echo %%X

さて、これを head コマンドに進化させるためには行数を数えないといけない。単純に for の中で環境変数を使ったのでは、for の最初に置換されてしまうため駄目である。 かといって、for /? に書いてあるように遅延展開を使ったのでは、8/28:変数置換の順序に書いたように、! を含んだファイルを正しく表示できない。

つづく