2012-12-03 39 views
7

Tôi hiện đang được giao nhiệm vụ tạo một số tiện ích trợ giúp dòng lệnh cho nhóm phát triển nội bộ của chúng tôi để sử dụng. Tuy nhiên, tôi muốn biết cách thực hành tốt nhất để tạo các công cụ dòng lệnh unix. Tôi đã thử xem git source code để biết ví dụ về cách đọc thông số và hiển thị thông báo cho phù hợp. Tuy nhiên, tôi đang tìm một mẫu rõ ràng để tạo công cụ, đọc thông số an toàn và hiển thị thông báo "trợ giúp" chuẩn nếu người dùng nhập thông số không chính xác hoặc --help Tôi muốn hiển thị thông báo trợ giúp. Có thư viện chuẩn nào để đọc số -abcFGH--parameter và quá trình chuyển đổi nào bắt đầu dựa trên thông số được truyền không?Cách tốt nhất để tạo công cụ dòng lệnh unix/linux trong C/C++ là gì?

Command-Line:

git 

hoặc

git --help 

Output:

usage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] 
     [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] 
     [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] 
     [-c name=value] [--help] 
     <command> [<args>] 
... 

Command-Line:

MyTool CommandName --CommandArgs 

Output:

Dù rằng lệnh cụ thể thực hiện.


Những gì tôi đã làm việc cho đến nay:

Code:

int main(int argc, char **argv) 
{ 
    if(argc < 2) 
    helpMessage(); 
    char* commandParameter = argv[1]; 
    if (strncmp(argv [1],"help", strlen(commandParameter)) == 0) 
     helpMessage(); 
    else if (strncmp(argv [1],"pull", strlen(commandParameter)) == 0) 
     pull(); 
    else 
     helpMessage(); 
} 

Điều gì sẽ là lý tưởng sẽ trông như thế này:

Code:

int main(int argc, char **argv) 
{ 
    MagicParameters magicParameters = new MagicParameters(argv); 
    switch(magicParameters[1]) 
    { 
     case command1: 
      Command1(); 
      break; 
     case ... 

     case help: 
     default: 
      HelpMessage(); 
      break; 
    } 
} 
+2

Bạn đã nhìn 'getopt() '? Nếu không, hãy kiểm tra 'getopt_long' đó là những gì bạn muốn, và cũng dễ dàng hơn trên mắt. –

Trả lời

8

getopt_long() là những gì bạn đang tìm kiếm, đây là một ví dụ về việc sử dụng đơn giản nhất:

static const struct option opts[] = { 
     {"version", no_argument, 0, 'v'}, 
     {"help",  no_argument, 0, 'h'}, 
     {"message", required_argument, 0, 'm'}, 
     /* And so on */ 
     {0,  0,     0, 0 } /* Sentiel */ 
    }; 
    int optidx; 
    char c; 

    /* <option> and a ':' means it's marked as required_argument, make sure to do that. 
    * or optional_argument if it's optional. 
    * You can pass NULL as the last argument if it's not needed. */ 
    while ((c = getopt_long(argc, argv, "vhm:", opts, &optidx)) != -1) { 
     switch (c) { 
      case 'v': print_version(); break; 
      case 'h': help(argv[0]); break; 
      case 'm': printf("%s\n", optarg); break; 
      case '?': help(argv[0]); return 1;    /* getopt already thrown an error */ 
      default: 
       if (optopt == 'c') 
        fprintf(stderr, "Option -%c requires an argument.\n", 
         optopt); 
       else if (isprint(optopt)) 
        fprintf(stderr, "Unknown option -%c.\n", optopt); 
       else 
        fprintf(stderr, "Unknown option character '\\x%x'.\n", 
         optopt); 
       return 1; 
     } 
    } 
    /* Loop through other arguments ("leftovers"). */ 
    while (optind < argc) { 
     /* whatever */; 
     ++optind; 
    } 
2

Hãy xem thư viện getopt.

Các vấn đề liên quan