3つのプログラミング言語での getopt の使い方メモ

C、PerlPython でのgetoptのサンプル。
とりあえず、help, version, user, password の4つのオプションを指定できるようにした。

  • 使い方
% my_getopt --help
% my_getopt -h
% my_getopt --version
% my_getopt -v
% my_getopt --user=foo --password=abc
% my_getopt -ufoo -pabc
% my_getopt --user=foo -pabc

のような感じ。短縮形での指定も可能。
helpを指定した場合には、usage を表示して終了。 version を指定した場合は、バージョン情報を表示して終了。 user とpassword を指定した場合は、その値を表示して終了。

  • C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>

static char *user=NULL;
static char *password=NULL;

void usage(){
  printf("Usage: my_getopt --user=<USERNAME> --password=<PASSWORD>\n");
}

void version(){
  printf("Version 0.0.1\n");
}

int main(int argc, char** argv){

  int c;
  while(1){
	static struct option long_options[] =
	  {
		{"user", required_argument, 0, 'u'},
		{"password", required_argument, 0, 'p'},
		{"help", no_argument, 0, 'h'},
		{"version", no_argument, 0, 'v'},
		{0,0,0,0}
	  };
	int option_index = 0;
	c = getopt_long( argc, argv, "u:p:hv", long_options, &option_index);

	if( c==-1 )
	  break;

	switch(c){
	case 'u':
	  user = (char *)malloc( sizeof(char) * (strlen(optarg)+1) );
	  strncpy( user, optarg, strlen(optarg)+1 );
	  break;
	case 'p':
	  password = (char *)malloc( sizeof(char) * (strlen(optarg)+1) );
	  strncpy( password, optarg, strlen(optarg)+1 );
	  break;
	case 'v':
	  version();
	  exit(EXIT_SUCCESS);
	case 'h':
	default:
	  usage();
	  exit(EXIT_SUCCESS);
	}
  }

  if( !(user && password) ){
	usage();
	exit(EXIT_FAILURE);
  }

  printf ("user: %s\n", user);
  printf ("password: %s\n", password);

  exit(EXIT_SUCCESS);

}
#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;

my $user;
my $password;
my $help;
my $version;

GetOptions('user=s' => \$user,
		   'password=s' => \$password,
		   'help' => \$help,
		   'version' => \$version,
	);

if($help){
	usage();
	exit(0);
}
if($version){
	version();
	exit(0);
}
unless($user && $password){
	usage();
	exit(-1);
}

print <<"END_OF_BODY"
\$user: $user
\$password: $password
END_OF_BODY

	;

sub usage{
    print 'perl my_getopt.pl --user=<USERNAME> --password=<PASSWORD>', "\n";
}

sub version{
    print 'Version: 0.0.1', "\n";
}
#!/usr/bin/python

import getopt
import sys

def usage():
    print 'python my_getopt.py --user=<USERNAME> --password=<PASSWORD>'

def version():
    print 'Version: 0.0.1'

def main():
    user=None
    password=None

    try:
        opts, args = getopt.getopt(sys.argv[1:], "u:p:hv", ["user=","password=","help", "version"])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-v", "--version"):
            version()
            sys.exit()
        if o in ("-u", "--user"):
            user = a
        if o in ("-p", "--password"):
            password = a

    if(user==None or password==None):
        usage()
        sys.exit(2)

    print "user:%s" % (user,)
    print "password:%s" % (password,)
    sys.exit(0)
    
if __name__ == "__main__":
    main()