欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C 语言getopt与go语言flag获取命令参数

程序员文章站 2022-06-24 20:23:27
C语言中的getopt()函数为命令参数的获取提供了很大便利,与golang中的flag功能类似。 c语言getopt">C语言getopt 下面...
    C语言中的getopt()函数为命令参数的获取提供了很大便利,与golang中的flag功能类似。
     下面以ssh中获取主机名/ip和用户名为例来示例如何使用getopt().
    int get_user_host(int ac, char **av, char *host, char *user){

    char *p, *cp;
    extern int optind;
    int opt;

    again:
    while ((opt = getopt(ac, av, "1246AaCfgKkMNnqsTtVvXxYyb:c:D:e:F:I:i:L:l:m:O:o:p:R:S:W:w:")) != -1){

        switch (opt){
        case '1':
            break;
        case '2':
            break;
        case '4':
            break;
        case '6':
            break;
        case 'A':
            break;
        case 'a':
            break;
        case 'C':
            break;
        case 'f':
            break;
        case 'g':
            break;
        case 'K':
            break;
        case 'k':
            break;
        case 'M':
            break;
        case 'N':
            break;
        case 'n':
            break;
        case 'q':
            break;
        case 's':
            break;
        case 'T':
            break;
        case 't':
            break;
        case 'V':
            break;
        case 'v':
            break;
        case 'X':
            break;
        case 'x':
            break;
        case 'Y':
            break;
        case 'y':
            break;
        case 'b':
            break;
        case 'c':
            break;
        case 'D':
            break;
        case 'e':
            break;
        case 'F':
            break;
        case 'I':
            break;
        case 'i':
            break;
        case 'L':
            break;
        case 'l':
            break;
        case 'm':
            break;
        case 'O':
            break;
        case 'o':
            break;
        case 'p':
            break;
        case 'R':
            break;
        case 'S':
            break;
        case 'W':
            break;
        case 'w':
            break;
        default:
            return -3;
        }
    }

    ac -= optind;
    av += optind;

    if (ac > 0 && strlen(host)==0 &&  **av != '-') {
        if (strrchr(*av, '@')) {
            p = strdup(*av);
            cp = strchr(p, '@');
            if (cp == NULL || cp == p){
                printf("can not find username nearby @");
                printf("\n");
                return -1;;
            }
            *cp = '\0';
            user = strcpy(user, p);
            host = strcpy(host,++cp);
        } else{
            host = strcpy(host, *av);
        }
       if (ac >1 ){
          optind  = 1;
          goto again;
       }
       ac--, av++;
     }
    if (strlen(host)==0){
        printf("can not find host address in parameters");
        printf("\n");
        return -2;
    }
return 0;
}

go语言flag

    go的flag相比于c的getopt使用起来简单很多。
cfgPath := flag.String("c","/etc/cfg.toml","cfg path")
nowaitFlag :=flag.Bool("w",false,"do not wait")

函数中第一个命令是”-c”、”-w”中的指示词,第二个为默认值,第三个为说明。无论顺序,主要正常出现就能解析。