私は bash にしろ C++ のプログラムにしろ,コマンドラインを処理する時にはできるだけ規則的なものだけにして極力簡単で済ませるようにしている.たとえば,全ての引数は '-arg_key value' のようなものであり,たとえ必要なファイル名であってもできるだけこの規則に従うようにしている.この場合,コマンドラインのオプションは必ず key を持つのでその結果は map に入れておけば良い.こうするだけでパースのコードは驚くほど簡単になり,getopt などを使う必要もない.また,コマンドラインのサポートはできるだけ簡単にしてできるだけconfig ファイルを用いることにしている.というのは,1つはこの方法では負の数値の指定に困るからであり,もう1つはテストなどでの再現が簡単だからである. しかし,この方法はコマンドラインオプションの value が空白を含む場合には問題が起きる.できれば config file だけですませたいが,そうもいかないこともある. そのような例を示そう. たとえば vector 値を渡したい場合に command -eye_position '0 0 -10' -up_vector '0 1 0' とするような場合を考える.C++ のプログラムを手動で起動する場合には問題はないが,これが test case などで shell script や python から呼び出したい場合には注意が必要である. この例を test_1.sh に示す. -- test_1.sh -- echo "call with two args, but the second one has spaces." echo "./test_2.sh args0 'args1_1 args1_2 args1_3'" ./test_2.sh args0 'args1_1 args1_2 args1_3' -- test_1.sh -- 呼び出される test_2.shはコマンドラインがどのように解釈されるかを示す. -- test_2.sh -- echo "show the args...