linux 命令行参数解析源码

        在linux系统上,服务的运行常以命令行的方式进行,命令行的方式又会跟上参数,比如著名的开源软件memcached,在服务器上运行这个服务时,往往需要添加上很多个参数以指定服务的配置。我们常见的命令行跟参数的格式有以下两种:

               exe -h -h 主机名 -p 端口号

               exe --help   --version  --host=主机名 --port==端口


解析第一种格式的命令行参数:这一种只能针对短选项进行解析

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> //getopt

int main(int argc, char *argv[])
{
    if (argc < 8) {
        printf("Usage: exe -u user -h host -p port -r");
        exit(-1);
    }   

    char *user, *host, *port;
    char c;
    while (-1 != (c = getopt(argc, argv, 
        "u:"     //user  冒号表示该选项需要 指明参数,参数通过optarg返回,不需要自行设定,头文件中已经包含
        "h:"     //host
        "p:"     //port
        "r"      //print something
        ))) {
        switch(c) {
            case 'u':
                user = strdup(optarg);
                break;
            case 'h':
                host = strdup(optarg);
                break;
            case 'p':
                port = strdup(optarg);
                break;
            case 'r':
                printf("arg r");
                break;
            default:
                break;
        }   
    }   

    printf("user: %s, host: %s, port: %s\n", user, host, port);

    return 0;
}


针对第二种长选项的解析,长选项的解析同时也能够简化为短选项,所以下面的命令行解析是通用的:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <getopt.h>


int main(int argc, char *argv[])
{
    const char *shotOptions = "u:h:p:v";  //短选项设定,冒号表示该选项需要跟参数
    struct option longOptions[] = {       //长选项结构体
        {"user", 1, NULL, 'u'},           //第一个参数表示长选项名称,第二个参数表示是否跟参数,0:不跟,1:跟,2:可带也可不带,第三个参数通常设为NULL,第四个参数可理解为与长选项对应的短选项
        {"host", 1, NULL, 'h'},
        {"port", 1, NULL, 'p'},
        {"version", 0, NULL, 'v'},
        {0, 0, 0, 0}
    };  

    char opt;
    char *user, *host, *port;
    while (-1 != (opt = getopt_long(argc, argv, shotOptions, longOptions, NULL))) {
        switch(opt) {
            case 'u':
                user = strdup(optarg);
                break;
            case 'h':
                host = strdup(optarg);
                break;
            case 'p':
                port = strdup(optarg);
                break;
            case 'v':
                printf("version\n");
                break;
            default:
                break;
        }   
    }   
    printf("user: %s, host: %s, port: %s\n", user, host, port);
    return 0;
}


对于长选项的命令行参数则可以这样指定:./exe --user my --host=192.168.12.21 -p 21211 

可以看到长选项实际上包含了对于短选项的解析,所以第二种的命令行解析是常用的。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值