Parsing Command Line Options

Seringkali dalam menjalankan suatu perintah/program/utility di Linux, kita melewatkan argumen (dan option) untuk mengatur perilaku atau output program yang dijalankan tersebut. Misalnya:

	ls -al
	cat filename.txt
	dd if=infile of=outfile

Ketiga perintah tersebut melewatkan argumen. Untuk program dengan bahasa C, perintah akan dimulai dari fungsi main, yang dideklarasikan sebagai

	int main(int argc, char *argv[])

dimana argc adalah jumlah argumen program dan argv adalah array string dari argumen tersebut.

Berikut akan dijabarkan fragmen kode program untuk memproses/parsing argument yang dilewatkan dalam suatu command line, yaitu menggunakan fungsi getopt() dan parsing dari argv langsung.

Menggunakan Fungsi getopt()

Fungsi getopt() dan getopt_long() didefinisikan dalam <unistd.h>.
Synopsis:

       #include <unistd.h>
       int getopt(int argc, char * const argv[], const char *optstring);
       int getopt_long(int argc, char * const argv[],
                  const char *optstring, const struct option *longopts, 
                  int *longindex);
       extern char *optarg;
       extern int optind, opterr, optopt;

Contoh:

/*
*  Program nettool yang support baik short maupun long options.
*  Synopsis: 
*   	nettool [-v][-h hostname][of=outfile] command 
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define PING 1
#define STAT 2

void show_usage(char *pgm)
{
	printf("usage: %s [options] <command>\n", pgm);
	printf("Options:\n");
	printf("  -v --verbose        Print verbose messages.\n");
	printf("  -h --host hostname  Set hostname.\n");
	printf("  of=outfile  		  Output file.\n");
	printf("command: ping stat\n");	
	exit(1);
}

int main(int argc, char *argv[])
{
    int opt;
    int verbose;
    int cmd = 0;  
    char hostname[20];
    const char *outfile = NULL;
    
    /* A string listing valid short options letters. */
	const char* const short_options = "vh:";
    /* An array describing valid long options. */
    const struct option long_options[] = {
   		{"verbose", 0, NULL, 'v'},
   		{"host", 1, NULL, 'h'}, 
                {0,0,0,0}	
    };

    while((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
        switch(opt) {
        case 'v':
        	verbose =1;
        	break;
        case 'h':
            sprintf(hostname,"%s",optarg);
            break;
        case ':': /*option butuh masukan*/
            printf("option needs a value\n");
            break;
		case '?': /*ada unrecognized option*/
			show_usage(argv[0]);		
        }
    }
    
    /*parsing argument langsung*/
    for(; optind < argc; optind++) {
        if (!strcmp(argv[optind],"ping"))
          	cmd += PING;
		else if (!strcmp(argv[optind],"stat"))
        	cmd += STAT;
        else if (!strncmp(argv[optind],"of=",3))
        	outfile = argv[optind]+3;	
    }
    
    if (cmd < 1) show_usage(argv[0]);
	
	if (cmd & PING) {
		printf("Ping: %s\n",hostname);
		/*Ping routine*/		
	}		
	if (cmd & STAT) {
		printf("Netinfo: \n");
		/*Get networking info routine*/
	};

    exit(0);
}

Referensi

  1. getopt manpage

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: