コマンドライン引数は、プログラムの実行時に追加情報を与えるやり方の一つです。

と、言ってもわかりにくいですかね?

Unix や Linux といった OS では、コマンドラインからプログラムを実行する際に以下のように引数を指定することができます。

$ rm hoge.txt # rm に 'hoge.txt' という引数を渡している
$ ls -l # ls に '-l' という引数を渡している
$ git status # git に 'status' という引数を渡している

この、 rm コマンドに渡している hoge.txt や、 ls コマンドに渡している -l や、git コマンドに渡している status がコマンドライン引数です。

ざっくりした全体像 

よくあるコマンドライン引数の使われ方としては、

  1. rm hoge.txt のように、プログラムに具体的な処理対象を渡す
  2. ls -l のように、プログラムの実行時の挙動を少しだけ変えるようなオプションを渡す
  3. git status のように、サブコマンドを渡す

と言った用途が見られます。

・・・が、基本的には OS やプログラムによって流儀はまちまち です。

本文書では、 Windows や Plan 9 など、 Unix/Linux 系以外の OS については言及しません。(詳しくないので・・・)

プログラムによって流儀がまちまちとはどういうことでしょうか? 実に当たり前なのですが、プログラムの作者はコマンドライン引数を どうとでも できます。例えば無視しても良いですし、 他のプログラムに移譲しても構いません。 そんなわけで、一般的には以下のルールに習慣的に従って作られています、が、このルールを無視するプログラムも書くことができます。

引数 - 具体的な操作対象を渡す

コマンドライン引数の最もわかりやすい使われ方は、コマンドの具体的な操作対象を引数としてコマンドに渡す 使い方です。 例えば、 rm はファイルを削除するコマンドで、引数として削除対象ファイルを取ります。

$ rm hoge.txt # rm に削除対象である `hoge.txt` をコマンドライン引数として渡している

mv はファイルを移動するコマンドで、引数として移動元のファイルと、移動先の新しいファイル名を取ります。

$ mv from.txt path/to/new.txt

このように、各種コマンドに具体的な操作対象をコマンドライン引数で渡すのが最も一般的な使われ方です。ファイル名以外にも、例えば expr コマンドに計算式を渡せば簡単な四則演算が行えます。

$ expr 47 - 20
27

sleep コマンドは指定秒数コマンドライン入力をストップさせるコマンドですが引数として待機する秒数を取ります

$ sleep 5 # 5 秒、コマンドライン入力がストップする

コマンド・プログラムによって、コマンドライン引数として幾つの値をとるのかはまちまちですが、 そのコマンドにとって最も重要な引数はコマンドライン引数経由で渡すのが一般的となっています。

オプション - プログラムの動作を変更する

コマンドライン引数としてオプションを渡すのも一般的な方法です。 オプションは、コマンドの動作を一部変更する ために用いられるのが一般的で、Unix/Linux 系の OS では - はオプションの開始として用いられます。

例えば、ls コマンドはディレクトリ中のファイル一覧を表示するコマンドですが、 -l オプションを指定することで、それぞれのファイルの詳細情報を追加で表示することができます。

$ ls # 通常は、そのディレクトリ中にあるファイルの一覧を表示する
foo bar baz
$ ls -l # `-l` オプションを追加することで、ファイルの詳細情報を追加で表示する
-rw-r-r-- john john  47 12 24 18:00 foo
-rw-r-r-- john john  47  8  9  2:230 bar
-rw-r-r-- john john  47  2 29 23:59 baz

- と英数字1文字で構成されるオプションを ショートオプション-- と英単語で構成されるオプションを ロングオプション と呼称することもあります。 どちらか一方しかない場合もありますし、同じオプションがそれぞれの形式で用意されている親切なプログラムもあります。

オプションも引数を取るものがあり、例えば sudo --user=USER のように、 = で引数を指定するものなどがあります。

また、単に -- を入力させ、以降に続く文字をそのプログラムのオプションとして扱わせないようにするものもあります。 例えば sudo --user USER1 -- foo --user USER2 の様に、 sudo 自身には --user USER1 を指定しつつ、 -- により、以降の文字列は sudo への引数とすることで foo には --user USER2 を与える、と言った用途に用いられます。

サブコマンド - カバー範囲を増やす

細かな操作の違いをサブコマンドとして提供するプログラムも数多くあります。

例えば、 git コマンドには数多くのサブコマンドが用意されています。

$ git init # リポジトリを初期化する
$ git commit # 新しくコミットする

サブコマンド自体にもそれぞれ引数やオプションを取れるようにすることも一般的です。

各言語でのコマンドライン引数 制御

各言語でのコマンドライン引数処理の実装例を、個別のページに記しました。 適宜、読んでいただければ幸いです。