Linux下解析命令行的标准形参(getopt)

简介: 在Linux下开发时,命令行的使用是必不可少的,经常会在命令行运行各种命令,启动服务,启动应用程序,查看函数用法等等;

一、前言

在Linux下开发时,命令行的使用是必不可少的,经常会在命令行运行各种命令,启动服务,启动应用程序,查看函数用法等等;运行这些命令时都会传入一些参数,比如:

$ ./c_app 127.0.0.1 8888 小明
$ man printf

这些命令行参数解析,Linux提供了一套函数,可以很方便的解析传入的各种参数信息。

这篇文章就介绍如何使用Linux提供的解析函数,完成命令的行的参数解析。

函数原型如下:

#include <unistd.h>
#include <getopt.h>

这3个是全局变量
extern char *optarg;
extern int optind, opterr, optopt;
功能介绍:
optarg——指向当前选项参数(如果有)的指针。  比如: cp 123.c 888/ -fv 、 gcc 123.c -o app
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个已知选项。

int getopt(int argc, char * const argv[],const char *optstring);
函数功能: 解析短选项形参. 只能解析单个字符.

函数参数:
int argc   就是main函数传入的argc 
char * const argv[]  就是main函数传入的argv
const char *optstring  将要解析的选项形参格式.
比如: "a:b:c:v"    字母后面跟着冒号就表示该选项形参必须传递参数.
传入形参的时候: a.out -a 666 -b 777 -c 888 -v

返回值:
解析成功就返回当前解析的选项形参的字符. 并且会给全局变量赋值. optarg这个指针就会指向该选项形参后面的数据地址.
如果失败就返回-1   解析错误会返回? 

int getopt_long(int argc, char * const argv[],
         const char *optstring,
         const struct option *longopts, int *longindex);
函数功能:解析长选项形参.
struct option {
   const char *name;   表示要解析的长选项字符串  --abc
   int         has_arg;   0表示不需要参数 1表示必须要 2表示可选
   int        *flag;     一般NULL
   int         val;      当解析到正确的长选项形参的时返回的字符  k
};


int getopt_long_only(int argc, char * const argv[],
         const char *optstring,
         const struct option *longopts, int *longindex);
函数功能:同时支持解析长选项形参和短选项形参.

二、案例代码

2.1 解析命令行的短选项形参

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>

int main(int argc,char **argv)
{
    int c;
    while(1)
    {
        //解析传入的选项参数   ./a.out -a 123 -b 456 -c 789 -v
        c=getopt(argc,argv,"a:b:c:v?");
        if(c==-1)break;
        switch(c)
        {
        case 'a':
            printf("当前的选项形参:a,值:%s\n",optarg);
            break;
        case 'b':
            printf("当前的选项形参:b,值:%s\n",optarg);
            break;
        case 'c':
            printf("当前的选项形参:c,值:%s\n",optarg);
            break;
        case 'v':
            printf("当前版本:1.2.3\n");
            break;
        case '?':
            printf("用法:./a.out [-a 123 -b 456 -c 789 -v] \n");
            break;   
        default:
            break;
        }
    }
    return 0;
}

[wbyq@wbyq linux_c]$ ./a.out -a 123 -b 67 -c 999
当前的选项形参:a,值:123
当前的选项形参:b,值:67
当前的选项形参:c,值:999
[wbyq@wbyq linux_c]$ ./a.out -a
./a.out: option requires an argument -- 'a'
用法:./a.out [-a 123 -b 456 -c 789 -v] 
[wbyq@wbyq linux_c]$ ./a.out -?
用法:./a.out [-a 123 -b 456 -c 789 -v] 
[wbyq@wbyq linux_c]$ ./a.out -v
当前版本:1.2.3
[wbyq@wbyq linux_c]$ 

2.2 解析命令行的长选项形参

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>

struct option opt_list[]=
{
    {"a123",1,NULL,'a'},
    {"b123",1,NULL,'b'},
    {"c123",1,NULL,'c'},
    {"help",0,NULL,'?'},
};

int main(int argc,char **argv)
{
    int c;
    while(1)
    {
        //解析传入的选项参数   ./a.out -a 123 -b 456 -c 789 -v
        c=getopt_long(argc,argv,"a:b:c:v?",opt_list,NULL);
        if(c==-1)break;
        switch(c)
        {
        case 'a':
            printf("当前的选项形参:a,值:%s\n",optarg);
            break;
        case 'b':
            printf("当前的选项形参:b,值:%s\n",optarg);
            break;
        case 'c':
            printf("当前的选项形参:c,值:%s\n",optarg);
            break;
        case 'v':
            printf("当前版本:1.2.3\n");
            break;
        case '?':
            printf("用法:./a.out [-a 123 -b 456 -c 789 -v] \n");
            break;   
        default:
            break;
        }
    }
    return 0;
}

[wbyq@wbyq linux_c]$ ./a.out -a 12345
当前的选项形参:a,值:12345
[wbyq@wbyq linux_c]$ ./a.out --a123 12345
当前的选项形参:a,值:12345
[wbyq@wbyq linux_c]$ ./a.out -?
用法:./a.out [-a 123 -b 456 -c 789 -v] 
[wbyq@wbyq linux_c]$ ./a.out --help
用法:./a.out [-a 123 -b 456 -c 789 -v] 
[wbyq@wbyq linux_c]$ 

2.3 解析复杂的命令行选项形参

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>

struct option opt_list[]=
{
    {"a123",1,NULL,'a'},
    {"b123",1,NULL,'b'},
    {"c123",1,NULL,'c'},
    {"help",0,NULL,'?'},
};

int main(int argc,char **argv)
{
    int c;
    while(1)
    {
        //解析传入的选项参数   ./a.out -a 123 -b 456 -c 789 -v
        c=getopt_long_only(argc,argv,"a:b:c:v?",opt_list,NULL);
        if(c==-1)break;
        switch(c)
        {
        case 'a':
            printf("当前的选项形参:a,值:%s\n",optarg);
            break;
        case 'b':
            printf("当前的选项形参:b,值:%s\n",optarg);
            break;
        case 'c':
            printf("当前的选项形参:c,值:%s\n",optarg);
            break;
        case 'v':
            printf("当前版本:1.2.3\n");
            break;
        case '?':
            printf("用法:./a.out [-a 123 -b 456 -c 789 -v] \n");
            break;   
        default:
            break;
        }
    }
    return 0;
}

[wbyq@wbyq linux_c]$ ./a.out 
[wbyq@wbyq linux_c]$ ./a.out -a 1234
当前的选项形参:a,值:1234
[wbyq@wbyq linux_c]$ ./a.out -a123 1234
当前的选项形参:a,值:1234
[wbyq@wbyq linux_c]$ ./a.out --a123 1234
当前的选项形参:a,值:1234
目录
相关文章
|
4月前
|
Java Linux 开发工具
Linux下版本控制器(SVN) -命令行客户端
Linux下版本控制器(SVN) -命令行客户端
84 3
|
5月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
616 12
|
5月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
106 20
|
5月前
|
Linux 数据安全/隐私保护
使用Linux命令行接入无线网络Wi-Fi的示例。
现在,你已经使用命令行成功地连接到 Wi-Fi 网络了。这两个示例涵盖了用 `nmcli` 和 `wpa_supplicant` 连接无线网络的常见场景,让你能够不依赖图形化界面来完成这个任务。在日常使用中熟练掌握这些基本操作能增强你对 Linux 系统的理解,帮助你更有效地处理各种问题。
228 12
|
6月前
|
Linux
Linux命令的基本格式解析
总的来说,Linux命令的基本格式就像一个食谱,它可以指导你如何使用你的计算机。通过学习和实践,你可以成为一个真正的“计算机厨师”,创造出各种“美味”的命令。
131 15
|
6月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
235 11
|
6月前
|
运维 安全 Linux
试试Linux设备命令行运维工具——Wowkey
WowKey 是一款专为 Linux 设备设计的命令行运维工具,提供自动化、批量化、标准化、简单化的运维解决方案。它简单易用、高效集成且无依赖,仅需 WIS 指令剧本文件、APT 账号密码文件和 wowkey 命令即可操作。通过分离鉴权内容与执行内容,WowKey 让运维人员专注于决策,摆脱繁琐的交互与执行细节工作,大幅提升运维效率与质量。无论是健康检查、数据采集还是配置更新,WowKey 都能助您轻松应对大规模设备运维挑战。立即从官方资源了解更多信息:https://atsight.top/training。
|
6月前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。
|
7月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
8月前
|
Ubuntu Shell Linux
Linux命令行解释器的模拟实现
Linux命令行解释器的模拟实现