起動オプション (argument)

多くの言語で getopt などのオプション解析ライブラリを用意しているが、それほど簡単に使えるものでもなく、制約もあるので、使用するのはお勧めできない。

Awk

-v オプションで、スクリプト外からスクリプトへ値を渡せる。次の例は 1 + 2 の結果として 3 を出力する。

$ awk -v va=1 -v vb=2 'BEGIN { print va + vb }'

メニューに戻る

C言語

直接

起動オプションの数と、起動オプションをすべて出力する例。argv[0] はプログラム名、argv[1] は最初のオプション・・・というように順番に格納される。

#include <stdio.h>

int main(int argc, char *argv[]) {
	int cnt;

	printf("%d\n", argc);

	for (cnt = 0; cnt < argc; cnt++) {
		puts(argv[cnt]);
	}
	return 0;
}

格納されている文字列はコマンドラインで指定されたままの形であり、特に argv[0]
$ ./a.out options
と起動されていれば "./a.out" だし、
$ /abs/path/a.out options
と起動されていれば "/abs/path/a.out" である。

起動オプション処理ライブラリ

getopt

-f -n 123 -s string

といった、一文字オプションのみ、またはそれに続くひとつのパラメータの形のオプションを処理するライブラリ。

以下の例で指定されている "fn:s::" というパラメータで、次のオプションを処理する指定となる。

#include <stdio.h>
#include <stdlib.h> // atoi
#include <unistd.h> // getopt

int main(int argc, char *argv[]) {
	char *optstring = "fn:s::";
	int opt;

	// オプションで指定した値を格納する変数。
	int flag;  // -f
	int num;   // -n<num> or -n <num>
	char *str; // -s[<str>]

	// オプションで指定した値を格納する変数を初期化。
	flag = 0;
	num = 0;
	str = "not set";

	opterr = 0; // getopt にエラーメッセージを出力させない

	while ((opt = getopt(argc, argv, optstring)) != -1) {
		switch (opt) {
		case 'f':
			flag = 1;
			break;
		case 'n':
			num = atoi(optarg);
			break;
		case 's':
			// 必要なら strdup する。
			// パラメータ無しの -s であれば NULL になる。
			str = optarg;
			break;
		case '?':
			printf("Warning: unknown opt -%c\n", optopt);
			break;
		}
	}

	// getopt で処理した結果を出力
	printf("flag = %d\n", flag);
	printf("num = %d\n", num);
	printf("str = %s\n", str);

	// 残りのオプションを出力
	{
		for (; optind < argc; optind++) {
			puts(argv[optind]);
		}
	}

	return 0;
}

getopt_long

--longoption といった、長いオプションを処理する。以下の例は、上の getopt の例と同じ動作に加えて、上の -f, -n, -s オプションの代わりに長いオプションも指定できるようにしたもの。

ソースコードは先の getopt とほぼ同じで、 印の3箇所のみが違っている。

#include <stdio.h>
#include <stdlib.h> // atoi
#include <getopt.h> // getopt_long ★

int main(int argc, char *argv[]) {
	char *optstring = "fn:s::";
	struct option longopts[] = { // ★
		{"flag", no_argument, NULL, 'f'},
		{"number", required_argument, NULL, 'n'},
		{"string", optional_argument, NULL, 's'},
	};
	int opt;

	// オプションで指定した値を格納する変数。
	int flag;  // -f
	int num;   // -n<num> or -n <num>
	char *str; // -s[<str>]

	// オプションで指定した値を格納する変数を初期化。
	flag = 0;
	num = 0;
	str = "not set";

	opterr = 0; // getopt にエラーメッセージを出力させない

	while ((opt = getopt_long(argc, argv, optstring, longopts, NULL)) != -1) { // ★
		switch (opt) {
		case 'f':
			flag = 1;
			break;
		case 'n':
			num = atoi(optarg);
			break;
		case 's':
			// 必要なら strdup する。
			// パラメータ無しの -s であれば NULL になる。
			str = optarg;
			break;
		case '?':
			printf("Warning: unknown opt -%c\n", optopt);
			break;
		}
	}

	// getopt で処理した結果を出力
	printf("flag = %d\n", flag);
	printf("num = %d\n", num);
	printf("str = %s\n", str);

	// 残りのオプションを出力
	{
		for (; optind < argc; optind++) {
			puts(argv[optind]);
		}
	}

	return 0;
}

--number の代わりに --num など、他と区別できれば短かくしてもよい、という説明もあるが、これはできない場合もある(バージョンによる?)。

一文字のオプションに対応させない場合は、optstring を "" にする。

メニューに戻る

Java

直接

起動オプションの数と、起動オプションをすべて出力する例。args[0] は最初のオプション・・・というように順番に格納される。他の言語と違い、args[0] はプログラム名ではない。

public class Arg
{
	public static void main(String[] args) {
		System.out.println(args.length);
		for (String arg: args) {
			System.out.println(arg);
		}
	}
}

メニューに戻る

Python

直接

起動オプションの数と、起動オプションをすべて出力する例。sys.argv[0] はプログラム名、sys.argv[1] は最初のオプション・・・というように順番に格納される。

import sys

print len(sys.argv)

for arg in sys.argv:
	print arg

起動オプション処理ライブラリ

getopt

-f -n 123 -s string

といった一文字オプションや、

--flag --number 123 --string string

といった長いオプション、及びそれに続くひとつのパラメータの形のオプションを処理するライブラリ。

以下の例で指定されている "fn:s:" というパラメータで、次のオプションを処理する指定となる。

C 言語の getopt(GNU 拡張)での "s::"(引数を取るが省略可能)という指定はできない。

import getopt
import sys

try:
	# 引数解析し、結果をタプルで返す。
	# 短い形式のみのときは第三引数を省略。
	# 長い形式のみのときは第二引数を "" にする。
	longopt = ['flag', 'number=', 'string=']
	opts, args = getopt.getopt(sys.argv[1:], "fn:s:", longopt)
except getopt.GetoptError, err:
	# 最初の知らないオプションで例外となり、解析は中断している。
	print "Error: unknown opt '" + err.opt + "'"
	sys.exit(1)

# オプションで指定した値を格納する変数を初期化。
flag = False
num = 0
str = "not set"

# getopt で処理した結果を出力
for opt, val in opts:
	if opt == '-f' or opt == "--flag":
		flag = True
	elif opt == '-n' or opt == "--number":
		num = int(val)
	elif opt == '-s' or opt == "--string":
		str = val

# getopt で処理した結果を出力
print "flag = %s" % flag
print "num = %d" % num
print "str = %s" % str

# 残りのオプションを出力
for arg in args:
	print arg

optparse

-f -n 123 -s string

といった一文字オプションや、

--flag --number 123 --string string

といった長いオプション、及びそれに続くひとつのパラメータの形のオプションを処理するライブラリ。

-h で自動的にヘルプを表示するなど、高機能。

from optparse import OptionParser

parser = OptionParser()
parser.add_option( \
	"-f",               # 短いオプション("" 指定可) \
	"--flag",           # 長いオプション(省略可) \
	dest="flag",        # 指定値を格納する変数名 \
	action="store_true",# オプション指定されると flag に True を設定 \
	default=False)      # オプション無指定時のデフォルト値
parser.add_option( \
	"-n",               # 短いオプション("" 指定可) \
	"--number",         # 長いオプション(省略可) \
	dest="num",         # 指定値を格納する変数名 \
	type="int",         # 整数パラメータを取る \
	default=0)          # オプション無指定時のデフォルト値
parser.add_option( \
	"-s",               # 短いオプション("" 指定可) \
	"--string",         # 長いオプション(省略可) \
	dest="str",         # 指定値を格納する変数名 \
	type="string",      # 文字列パラメータを取る \
	default="not set")  # オプション無指定時のデフォルト値

# ↑オプション無指定で default 指定が無いと、値は None となる。

opts, args = parser.parse_args()

# parse_args で処理した結果を出力
print "flag = %s" % opts.flag
print "num = %d" % opts.num
print "str = %s" % opts.str

# 残りのオプションを出力
for arg in args:
	print arg

メニューに戻る

Ruby

直接

起動オプションの数と、起動オプションをすべて出力する例。ARGV[0] は最初のオプション・・・というように順番に格納される。他の言語と違い、ARGV[0] はプログラム名ではない。プログラム名は $0

ARGV は $* と等価。

puts ARGV.size

ARGV.each { |arg|
	puts arg
}

OptionParser

-f -n 123 -s string

といった一文字オプションや、

--flag --number 123 --string string

といった長いオプション、及びそれに続くひとつのパラメータの形のオプションを処理するライブラリ。

-h で自動的にヘルプを表示するなど、高機能。

require 'optparse'

flag = false
num = 0
str = "not set"

opts = OptionParser.new

opts.on(
	"-f",       # 短いオプション(省略可)
	"--flag"    # 長いオプション(省略可)
) { |b|   # -f が指定されると b = true で呼ばれる。
	flag = true
}
opts.on(
	"-n N",     # 短いオプション(省略可)。N は任意の文字列で、必須パラメータを示す。
	"--number", # 長いオプション(省略可)。こちらにも N を書いても書かなくても良い。
	Integer     # 整数パラメータを取る
) { |n|
	num = n
}
opts.on(
	"-s [S]",   # 短いオプション(省略可)。[S] の S は任意の文字列で、省略可能パラメータを示す。
	"--string", # 長いオプション(省略可)。こちらにも [S] を書いても書かなくても良い。
	String      # 文字列パラメータを取る
) { |s|
	str = s
}

opts.parse!(ARGV)

# parse_args で処理した結果を出力
puts "flag = #{flag}"
puts "num = #{num}"
puts "str = #{str}"

# 残りのオプションを出力
ARGV.each { |arg|
	puts arg
}

メニューに戻る

Shell

直接

起動オプションの数と、起動オプションをすべて出力する例。最初のオプションから順に $1, $2, ... というようにアクセスできるが、shift によって $2 は $1 へ、$3 は $2 へ・・・というようにシフトできる。$0 はプログラム名である。$0 は shift の対象にならない。

echo $#

while [ "$1" != "" ]
do
	echo $1
	shift
done

getopt

-f -n 123 -s string

といった一文字オプションや、

--flag --number 123 --string string

といった長いオプション、及びそれに続くひとつのパラメータの形のオプションを処理するコマンド。

以下の例で指定されている "fn:s::" というパラメータで、次のオプションを処理する指定となる。

OPTS=`getopt -o fn:s:: --long flag,number:,string:: -- "$@"`

if [ $? != 0 ]; then
	echo Error
	exit 1
fi

# オプションで指定した値を格納する変数。
flag=0
num=0
str='not set'

eval set -- "$OPTS"

while true; do
	case "$1" in
	-f|--flag) flag=1; shift;;
	-n|--number) num=$2; shift 2;;
	-s|--string) str=$2; shift 2;;
	--) shift; break;;
	*) echo "Error";;
	esac
done

#  getopt で処理した結果を出力
echo "flag = $flag"
echo "num = $num"
echo "str = $str"

# 残りのオプションを出力
for arg do
	echo $arg
done

メニューに戻る