Linux下的程序,常常支持N多的命令行选项。那么,我们怎样编写支持命令行选项的程序呢。
以下给出两个演示样例。
      
    
演示样例1,简单的命令行选项。
以下的程序,支持4个选项, -i,-n,-s,-d
编译后,能够这样运行 (选项之间的顺序无所谓):
./a.out -i -n 100 -s hahaha -d
好了,以下是代码。
      #include <stdio.h>
      
       #include <unistd.h>
      
       #include <stdlib.h>
      
      
      
       int enable_opt_i;
      
       int enable_opt_d;
      
       int int_para_n;
      
       char *str_para_s;
      
      
      
       void parse_args(int argc, char *argv[])
      
       {
      
          int opt;
      
           while ((opt = getopt(argc, argv, "iIn:s:d")) != -1)
      
           {
      
              switch (opt)
      
              {
      
                  case 'i':
      
                  case 'I':
      
                      enable_opt_i = 1;
      
                      break;
      
                      
      
                  case 'n':    
      
                      int_para_n = atoi(optarg);
      
                      break;
      
                      
      
                  case 's':    
      
                      str_para_s = optarg;
      
                      break;
      
      
                  case 'd':    
      
                      enable_opt_d = 1;
      
                      break;
      
      
                  default: /* '?' */
      
                      printf("Usage: %s [-<i/I>] [-n number] [-s string] [-d]\n",
      
                              argv[0]);
      
              }
      
           }
      
      
      
       }
      
      
       int main(int argc, char *argv[])
      
       {
      
           parse_args(argc, argv);
      
      
      
           printf("enable_opt_i = %d\n",enable_opt_i);
      
           printf("enable_opt_d = %d\n",enable_opt_d);
      
           printf("int_para_n   = %d\n",int_para_n  );
      
           printf("str_para_s   = %s\n",str_para_s  );
      
           
      
           return 0;
      
       }
      
    
      
    
演示样例二,长选项(同一时候混合了简单选项)。
以下的程序,支持7个选项, -i,-n,-s,-d,--opt_a, --opt_b,--opt_c
编译后,能够这样运行 (选项之间的顺序无所谓):
./a.out -i -n 100 -s hahaha -d --opt_a --opt_b=95555 --opt_c=cmbbank
好了,以下是代码。
      #define _GNU_SOURCE
      
      
      
       #include <stdio.h>
      
       #include <unistd.h>
      
       #include <getopt.h>
      
       #include <stdlib.h>
      
      
      
       int enable_opt_i;
      
       int enable_opt_d;
      
       int int_para_n;
      
       char *str_para_s;
      
      
      
       #define    LONG_OPT_A_ID    (1000)
      
       #define    LONG_OPT_B_ID    (1001)
      
       #define    LONG_OPT_C_ID    (1002)
      
      
      
       int enable_long_opt_a;
      
       int long_int_para_b;
      
       char *long_str_para_c;
      
      
      
       struct option my_options[] =
      
           {
      
               {"opt_a",  no_argument,       NULL, LONG_OPT_A_ID},
      
               {"opt_b",  required_argument, NULL, LONG_OPT_B_ID},
      
               {"opt_c",  required_argument, NULL, LONG_OPT_C_ID},
      
               {0},
      
           };
      
      
      
       void parse_args(int argc, char *argv[])
      
       {
      
          int opt;
      
           while ((opt = getopt_long(argc, argv, "iIn:s:d", my_options, NULL)) != -1)
      
           {
      
              switch (opt)
      
              {
      
                  case 'i':
      
                  case 'I':
      
                      enable_opt_i = 1;
      
                      break;
      
                      
      
                  case 'n': 
      
                      int_para_n = atoi(optarg);
      
                      break;
      
                      
      
      
      
                  case 's': 
      
                      str_para_s = optarg;
      
                      break;
      
      
      
                  case 'd':    
      
                      enable_opt_d = 1;
      
                      break;
      
      
      
                  case LONG_OPT_A_ID:
      
                      enable_long_opt_a = 1;
      
                      break;
      
      
      
                  case LONG_OPT_B_ID:
      
                      long_int_para_b = atoi(optarg);
      
                      break;
      
      
      
                  case LONG_OPT_C_ID:
      
                      long_str_para_c = optarg;
      
                      break;
      
      
      
      
      
                  default: /* '?' */
      
                      printf("Usage: %s [-<i/I>] [-n number] [-s string] [-d] [--opt_a] [--opt_b=number] [--opt_c=string]\n",
      
                              argv[0]);
      
              }
      
           }
      
      
      
       }
      
      
      
       int main(int argc, char *argv[])
      
       {
      
           parse_args(argc, argv);
      
      
      
           printf("enable_opt_i = %d\n",enable_opt_i);
      
           printf("enable_opt_d = %d\n",enable_opt_d);
      
           printf("int_para_n   = %d\n",int_para_n  );
      
           printf("str_para_s   = %s\n",str_para_s  );
      
      
      
           printf("enable_long_opt_a = %d\n",enable_long_opt_a);
      
           printf("long_int_para_b   = %d\n",long_int_para_b  );
      
           printf("long_str_para_c   = %s\n",long_str_para_c  );
      
      
      
           return 0;
      
       }
      
    

