Windows+C#でseq風コマンドを作る


アニメ『アイドル事変』
アイドルが国会議員のようです。国が明るくなりそうです。

せっかくWindowsPCを手に入れたので、Windows上でもコマンドを使っていきたいと思います。
Windowsで、LinuxやUnixで使えるようなコマンドを使いたいときは、CygwinやGnuWin等あると思いますが、コマンドを深く学習するため、プログラミングでコマンドを作ってみます。
Windowsですが、プログラミングをするのに、特にコンパイラを入れる必要はありません。BATファイルもあれば、VBScript、C#などなど、最初から使えるツールが標準装備されています。

今回はC#でプログラミングをしてseqコマンドを作ってみたいと思います。

まずは、C#のコンパイラを探してみましょう。

コマンドプロンプトを起動して、dir /b /s csc.exeを実行します。

たくさん見つかりましたが、今回は一番上のこのパスを通しておきます。
C:\Windows\Microsoft.NET\Framework\v2.0.50727

システムのプロパティ→環境変数

→システムの環境変数→Pathに、さきほどのパスを追加します。

パスが通ったかコマンドプロンプトで、cscを実行して確認してみます。

C#の簡単なプログラムを作って実行してみましょう。

using System;

class Test{
	static void Main(string[] args){
		Console.WriteLine("Hello "+args[0]);
	}
}

csc ファイル名
でコンパイルできます。

seqコマンドの作成に入る前に、seqコマンドの動かし方、3パターンをおさらいしてみます。

引数が1つの場合は、1から指定した数までの1ずつ増加する数列を作ります。

takk@deb83:~$ seq 10
1
2
3
4
5
6
7
8
9
10
takk@deb83:~$ 

引数が2つの場合は、第一引数が数列の最初の数で、第二引数が最後の数となります。1ずつ増加します。

takk@deb83:~$ seq 5 10
5
6
7
8
9
10
takk@deb83:~$ 

最後に引数が3つの場合。第一引数が最初の数、第二引数が増加数、第三が最後の数です。

takk@deb83:~$ seq 10 -3 -15
10
7
4
1
-2
-5
-8
-11
-14
takk@deb83:~$ 

このようにseqコマンドは指定する引数の数によって、引数の位置が異なります。プログラムで判定するには、引数の数をチェックします。

     5	int inc = 1;
     6	int first = 1;
     7	int i,last;
     8	if(args.Length > 2)
     9		inc = int.Parse(args[1]);
    10	if(args.Length > 1)
    11		first  = int.Parse(args[0]);
    12	last = int.Parse(args[args.Length-1]);
    13	

引数チェックをして、first、inc、lastを設定したら、for文で回して表示するだけです。
ただし、incがマイナスの場合は、数列も大きな数から小さな数になっていきますので、増加減少の判定が必要になります。

    14	if(inc > 0)
    15		for(i=first;i<=last;i+=inc)
    16			print(i);
    17	else if(inc < 0)
    18		for(i=first;i>=last;i+=inc)
    19			print(i);

ちなみに、coreutilsのseqコマンドでは、増分を0にすると無限ループとなります。

takk@deb83:~/tmp$ seq 1 0 5
1
1
1
1
1
1
1
1
1
1
1^C

C#のseqコマンドプログラムを全体を通して見てみましょう。

     1	using System;
     2	
     3	class Test{
     4		static void Main(string[] args){
     5			int inc = 1;
     6			int first = 1;
     7			int i,last;
     8			if(args.Length > 2)
     9				inc = int.Parse(args[1]);
    10			if(args.Length > 1)
    11				first  = int.Parse(args[0]);
    12			last = int.Parse(args[args.Length-1]);
    13	
    14			if(inc > 0)
    15				for(i=first;i<=last;i+=inc)
    16					print(i);
    17			else if(inc < 0)
    18				for(i=first;i>=last;i+=inc)
    19					print(i);
    20		}
    21		static void print(int num){
    22			System.Console.WriteLine(""+num);
    23		}
    24	}

ではWindowsで使ってみます。

One response to “Windows+C#でseq風コマンドを作る

  1. Pingback: コマンドラインからC#でDXライブラリを使う | コマンドの達人

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA