GETOPT函数详解

news2024/11/28 18:57:18

一、目的

        相信第一次接触linux的小伙伴在使用命令行时肯定有这样的疑惑,命令行各种各样的选项和选项参数是怎样实现的(各个命令的选项的含义可以通过man手册查看)。

二、介绍

        在正式介绍之前,我们先来看一下命令行选项的使用(以ls(查看目录下的内容)为例)

        1.不带选项

ls

        2.带一个选项

ls -l

        3.带多个选项

ls -a -l

        4.多个选项合并

ls -al

        另外有些选项必须带参数,有些选项参数非必须(即可以带参数也可以不带参数)

         从上面的示例可以看到选项一般以'-'开头,后面紧跟至少一个字母(建议使用a-z A-Z)(如果'-'后面存在多个字母那么选项会合并)这种形式的选项叫做短选项;如果是以"--"开头那么代表长选项(本篇不介绍),例如ls就有一个"--color=when" 选项。


        如果要实现上述类似的功能,可以用到getopt函数(只支持短选项)

        

        其中argc/argv来自int main(int argc, char **argv);

        optstring指定选项列表(举例来说optstring="abcd:e::")

        其中a代表命令行参数"-a"

                b代表命令行参数"-b"

                c代表命令行参数"-c"

                d代表命令行参数"-d123"或者"-d 123",其中123就是选项参数

                e代表命令行参数"-e123"或者"-e",注意此处的123是选项参数,‘e’和"123"之间不能有空格

        optind记录下一个命令行参数,默认值为1,也就是从argv[1]开始解析

        optopt记录当前解析的选项

        optarg记录当前选项的参数,如果未指定参数则为NULL;例如"-e123"选项optarg="123","-e"选项optarg=NULL

        opterr默认为1,当输入不识别的选项或者需要选项参数的选项没有选项参数时会报错

        getopt的返回值可以是指定的optstring里面的字符,也可能是-1;也可以是'?'和':';具体请看下面的说明。


        使用示例

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int opt;
    //opterr = 0; //(1)
    while ((opt = getopt(argc, argv, "abcd:e::-")) != -1) {
        printf("current char: (opt)%c-(optopt)%c, optind: %d\n", opt, optopt, optind);
        switch (opt) {
        case 'a':
            break;
        case 'b':
            break;
        case 'c':
            break;
        case 'd':
            printf("arguments: %s\n", optarg);
            break;
        case 'e':
            printf("arguments: %s\n", optarg ? optarg : "none");
            break;
        case ':':
        case '?':
        default:
            printf("invalid parameter\n");
            break;
        }
    }
    printf("===extra arguments===\n");
    while (optind < argc) {
        printf("%s\n", argv[optind++]);
    }
    printf("=====================\n");
    return 0;
}

        编译

gcc getopt_test.c -o getopt_test

        测试

         因为选项d需要指定选项参数,如果没有指定选项参数,那么getopt默认会打印错误信息,告知错误原因,并且getopt返回值为'?'

./getopt_test -d

./getopt_test: option requires an argument -- d
current char: (opt)?-(optopt)d, optind: 3
invalid parameter
===extra arguments===
=====================
./getopt_test -x

./getopt_test: illegal option -- x
current char: (opt)?-(optopt)x, optind: 2
invalid parameter
===extra arguments===
=====================

        如果不需要有这样的错误输出可以设置opterr=0,请查看代码注释(1)

        如果我们设置了otperr=0,那么怎么区分是指定了不支持的参数,还是选项参数未指定呢?

        有两种方法:

        第一种,通过判断optopt的值,如果optopt的值不是optstring里面的字符,就代表是非有效选项字符;

        第二种,在optstring的开头添加':',举例设置optstring为":abcd:e::",这个时候通过getopt返回值是'?'(选项不存在)还是':'(选项未指定参数)来区分 。

        


        在实际使用时,我们的命令行不仅仅有选项和选项参数,还有一些额外的参数

./getopt_test -a -b -c x y z

current char: (opt)a-(optopt)a, optind: 2
current char: (opt)b-(optopt)b, optind: 3
current char: (opt)c-(optopt)c, optind: 4
===extra arguments===
x
y
z
=====================

        上面的x/y/z就是命令行额外参数(位置参数)

        如果某个位置参数是'-a'时,我们应该怎么处理呢?(-a会被认为是选项a)

./getopt_test -a -b -c -- -a

current char: (opt)a-(optopt)a, optind: 2
current char: (opt)b-(optopt)b, optind: 3
current char: (opt)c-(optopt)c, optind: 4
===extra arguments===
-a
=====================

        通过"--"我们可以将位置参数和选项隔离;

        


        选项参数是可以以‘-’开头的(不建议)

./getopt_test -d -abc

current char: (opt)d-(optopt)d, optind: 3
arguments: -abc
===extra arguments===
=====================
./getopt_test -d-abc

current char: (opt)d-(optopt)d, optind: 2
arguments: -abc
===extra arguments===
=====================

        "-abc"会被认为是"-d"的选项而不是选项"-a -b -c" 

以上,就是getopt函数的基本内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库原理+openGauss

文章目录 0. 准备工作0.1 实验环境0.2 主要内容0.3 学习资源 1. 安装部署实验&#xff08;实验一&#xff09;1.1 下载VirtualBox1.2 安装VirtualBox1.3 镜像文件导入1.4 启动虚拟机1.5 数据库使用1.6 数据库基本操作 2 表&模式&#xff08;实验二&#xff09;2.1 创建模式…

jmeter如何测试一个post请求(发送json请求报文)

目录 1.配置测试计划1.1.创建POST的HTTP请求取样器&#xff08;模拟POST请求&#xff09;1.2.创建HTTP信息头管理器 2.执行压测并查看结果 jmeter如何测试一个发送json报文的post请求. 更详细的配置请参考另外一篇博文&#xff1a; jmeter如何测试一个get请求 1.配置测试计划 …

独立站运营必做的6项工作内容

独立站的运营工作内容比较繁琐和全面&#xff0c;主要包括以下几个方面&#xff1a; 一、网站策划和设计 定义网站目标和定位制定网站规划和设计方案确定网站主题、颜色和页面布局确定网站的核心功能和用户体验设计网站的Logo和其他品牌元素 二、网站建设和维护 选择网站主…

React基础入门【一】

官方文档&#xff1a;https://react.docschina.org/ 说明 本文总结自尚硅谷课程。学习本教程之前&#xff0c;最好具备vue的基础知识&#xff0c;明白虚拟DOM、jsx这些前置知识。接下来&#xff0c;我们通过一个简单的示例来展示react的使用。 注意&#xff1a;入门的学习不…

【Atlas 200】华为昇腾Atlas 200加速模块RC场景无法启动卡在Start to jump Linux kernel

问题现象 RC场景下&#xff0c;装有华为昇腾Atlas 200加速模块的开发板无法启动系统。 将制作好系统的SD卡插入开发板&#xff0c;0号串口输出的日志卡在Start to jump Linux kernel&#xff0c;之后没有更多输出。 可能原因 一种比较大的可能是——在制作系统时&#xff0c…

Mac终端代理

1.打开代理查看代理端口号 打开设置&#xff0c;点击网络&#xff0c;点击详细信息&#xff0c;点击代理查看代理端口号。 2.修改环境变量 1&#xff09;终端输入下面命令 vim .zshrc 2&#xff09;在.zshrc文件里添加下面两段内容&#xff08;注意&#xff1a;7980为端口号…

力扣206反转链表:代码实现+图文全解+方法总结(四种方法)

文章目录 第一部分&#xff1a;题目描述第二部分&#xff1a;题解2.1 方法一&#xff1a;生成新节点到新链表2.2 方法二&#xff1a;复用旧节点到新链表&#x1f340; 面向过程式思想方法&#x1f340; 面向对象式思想方法 2.3 方法三&#xff1a;递归2.4 旧链表中移动旧节点 第…

02:MYSQL---DML

目录 1:介绍 2:DML数据操作 1:介绍 DML英文全称是Data Manipulation Lanquage(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增删改操作。 添加数据 :insert 修改数据:update 删除数据:delete 2:DML数据操作 给指定字段添加数据 insert into 表名(字段名1,…

segment-anything本地部署使用

前言 Segment Anything Model&#xff08;SAM&#xff09;是一种先进的图像分割模型&#xff0c;它基于Facebook AI在2020年发布的Foundation Model3&#xff0c;能够根据简单的输入提示&#xff08;如点或框&#xff09;准确地分割图像中的任何对象&#xff0c;并且无需额外训…

将项目导入到github全过程

新建仓库 完善仓库信息 然后点击创建仓库 复制仓库地址 将文件上传到git上 我这里要上传IMProject文件夹&#xff0c;所以就在这个文件夹内部&#xff0c;右键鼠标&#xff0c;然后点击git bash here 输入git init &#xff0c;然后文件夹里面就会多一个.git文件 输入gi…

【IoT】ChatGPT 与 AI 硬件

随着AI的发展&#xff0c;比如最近炒得很火的ChatGPT&#xff0c;还在持续快速迭代更新。 当然了&#xff0c;对于软件和算法&#xff0c;如果你想&#xff0c;每天迭代 10 个版本都可以。 包括科大讯飞的星火认知大模型最近也刚发布。 这就引出了未来一个更大的发展方向&am…

PMP课堂模拟题目及解析(第7期)

61. 为限制项目变更的数量&#xff0c;项目经理制定了严格的变更管理计划&#xff0c;只允许批准减轻重大潜在或实际风险的变更&#xff0c;一位团队成员提出了一个范围变更&#xff0c;该变更将消除对一个落后于进度计划的外部项目的依赖关系。项目经理应该怎么做&#xff1f…

AI绘图实战(九):给热门歌曲做配图 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …

迎接新时代挑战:项目管理中的创新与发展

你想知道如何在你的 PM 角色中保持最新状态吗&#xff1f; 您所在的行业是否发展如此之快&#xff0c;以至于有一天您可能不再需要您&#xff1f; 随着人工智能、敏捷和授权团队的兴起&#xff0c;项目经理还需要吗&#xff1f;也许吧&#xff0c;但不是出于您可能期望的原因。…

@vant/weapp

文章目录 一、介绍二、安装1. cd 到项目文件目录2. 使用 npm 安装3. 修改项目配置4. 构建5. 其他文件 三、使用四、【参考】 微信小程序使用vant/weapp组件 一、介绍 Vant 是一个开源的移动端组件库&#xff0c;在微信小程序开发中可以使用该UI库提提供的组件。 使用这个三方…

用户分享 | Dockquery,一个国产数据库客户端的初体验

DockQuery 有话说 DockQuery &#xff0c;「天狼」也&#xff0c;中原本土狼种。天狼年纪很小&#xff0c;不满一岁&#xff0c;但它有一个伟大的梦想——建造一座能容纳中原群狼的宫殿&#xff01;它不想再被异域狼欺负&#xff0c;不想被异域狼群挤占生存空间&#xff0c;它…

点到直线距离估计线性回归参数

点到直线距离估计线性回归参数 文章目录 点到直线距离估计线性回归参数[toc]1 推导2 模拟 1 推导 普通最小二乘法(OLS)估计线性回归方程的参数要求残差平方和最小&#xff0c;通过优化方法计算出各参数的估计量。其中残差 e i y i − β 0 − β 1 x i e_iy_i-\beta_0-\beta…

docker安装Nexus3搭建docker私有仓库,并上传镜像

参考&#xff1a;https://blog.csdn.net/gengkui9897/article/details/127353727 nexus3支持的私有库 支持maven(java)、npm&#xff08;js&#xff09;、docker、herm、yum、apt、pypi(python)go、等等 1. 下载安装docker&#xff08;略&#xff09; 根据系统选择对应版本…

T-SQL游标的使用

一.建表 INSERT INTO cloud VALUES( 你 ) INSERT INTO cloud VALUES( 一会看我 ) INSERT INTO cloud VALUES( 一会看云 ) INSERT INTO cloud VALUES( 我觉得 ) INSERT INTO cloud VALUES( 你看我时很远 ) INSERT INTO cloud VALUES( 你看云时很近 ) 二.建立游标 1.游标的一般格…

微软Office Plus吊打WPS Office?不一定,WPS未来被它“拿捏”了

微软Office Plus吊打WPS Office&#xff1f; 微软的Office是一款非常强大的软件。不仅仅在办公领域中能给我们带来便利&#xff0c;在娱乐和生活的各个方面的管理也能带来很多便利。 当然&#xff0c;作为国产办公软件的排头兵WPS与微软Office的抗衡已经有长达30多年&#xf…