7

私は現在、社内開発チームが使用できるコマンドラインヘルパーユーティリティの作成を担当しています。ただし、UNIXコマンドラインツールを作成するためのベストプラクティスを知りたいです。パラメータを読み取り、それに応じてメッセージを表示する方法の例として、gitソースコードを表示してみました。--helpただし、ツールを作成し、パラメーターを安全に読み取り、ユーザーが間違ったパラメーターを入力した場合、またはヘルプメッセージを表示したい場合に、標準の「ヘルプ」メッセージを表示するための明確なテンプレートを探しています。渡されたパラメータに基づいて開始するプロセスを読み取り、切り替える-abcFGHための標準ライブラリはありますか?--parameter

コマンドライン:

git

また

git --help

出力:

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>]
...

コマンドライン:

MyTool CommandName --CommandArgs

出力:

その特定のコマンドが行うことは何でも。


私がこれまでに取り組んできたこと:

コード:

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();
}

理想的なものは次のようになります。

コード:

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

        case help:
        default:
            HelpMessage();
            break;
    }
}
4

2 に答える 2

8

getopt_long()はあなたが探しているものです、これが最も簡単な使用法の例です:

   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;
    }
于 2012-12-03T21:20:22.027 に答える
2

getoptライブラリを見てください。

于 2012-12-03T21:10:22.203 に答える