命令行程序选项解析函数—getopt

2023-11-10

转载请注明出处:http://blog.csdn.net/zhangyang0402/archive/2010/06/14/5671410.aspx

 

 

命令行工具下的参数选项有两种,长选项短选项。短选项以-开头,后面跟单个字母;长选项以--开头,后面可跟多个字母。

 

功能:解析命令行短选项参数

函数原型:

#include <getopt.h>

int getopt(int argc, char * const argv[], const char *optstring);

几个外部变量

extern char *optarg;  

extern int optind, opterr, optopt;

optarg:若短选项后有参数,则optarg指向该参数

optind:扫描选项时,标识下一个选项的索引;扫描结束后,标识第一个非选项参数索引

opterr:出现不可识别的选项时,getopt将打印错误信息。将opterr设为0,可不打印错误信息。

optopt:存放不可识别的选项至optopt

 

1. 参数

argc:参数的个数(main)

argv:参数数组(main)

optstring:短选项字符集合,如 -i -n中的i,n

 

若选项后面有参数,则选项字符后加:, 对应的参数值保存在外部变量optarg中

如optstring 为"i:a",则表示程序支持两个短选项 -i arg和-a, -i后面须有参数值

当执行./a.out -i filename -a时,optarg指针就指向filename

 

2. 解析过程

getopt首先扫描argv[1]到argv[argc-1],并将选项及参数依次放到argv数组的最左边,非选项参数依次放到argv的最后边

如执行程序为:

     0     1   2  3  4  5  6   7  8  9 

$ ./mygetopt file1 -i infile -a -o outfile -v -h file2

 

扫描过程中,optind是下一个选项的索引, 非选项参数将跳过,同时optind增1。optind初始值为1。当扫描argv[1]时,为非选项参数,跳过,optind=2;扫描到-i选项时,后面有参数,下一个将要扫描的选项是-a,则optind更改为4;扫描到-a选项时,下一个选项是-o,optind=5;扫描到-o选项时,后面有参数,下一个选项是-v,optind=7;扫描到-v选项时,下一个选项是-h,optind=8;扫描到-h选项时,optind=9

 

扫描结束后,getopt会将argv数组修改成下面的形式

     0    1  2  3  4  5   6  7  8   9

$./mygetopt -i infile -a -o outfile -v -h file1 file2

 

同时,optind会指向非选项的第一个参数,如上面,optind将指向file1

 

 

3. 返回值

若getopt找到短选项字符,则返回该选项字符;

若出现不能接受的选项字符或丢失选项参数,则返回?,同时optopt将被设置成相应选项字符;

则后面没有选项字符,则返回-1

 

4. 测试

 mygetopt.c

  1. #include<stdio.h>  
  2. #include<getopt.h>  
  3.   
  4. void usage(const char *p);  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     int ch=0;  
  9.     opterr=0; // prevent error information to print for unrecognized options  
  10.     while( (ch=getopt(argc, argv, "i:ao:vh") ) != -1 )  
  11.      {  
  12.         switch(ch)  
  13.         {  
  14.            case 'i':  
  15.                 printf("option i: %s/n", optarg);  
  16.                 printf("optind=%d/n/n", optind);  
  17.                 break;  
  18.            case 'a':  
  19.                 printf("option a :%c/n", ch);  
  20.                 printf("optind=%d/n/n", optind);  
  21.                 break;  
  22.            case 'o':  
  23.                 printf("option o: %s/n", optarg);  
  24.                 printf("optind=%d/n/n", optind);  
  25.                 break;  
  26.            case 'v':  
  27.                 printf("option v: %c/n", ch);  
  28.                 printf("optind=%d/n/n", optind);  
  29.                 break;  
  30.            case 'h':  
  31.                 usage(argv[0]);  
  32.                 printf("optind=%d/n/n", optind);  
  33.                 break;  
  34.            default:  
  35.                 printf("unrecognized option: %c/n", optopt);  
  36.                 usage(argv[0]);  
  37.         }  
  38.      }  
  39.     if ( optind < argc )  
  40.        {  
  41.           printf("/nnon-option arguments below:/n");  
  42.           while( optind < argc )  
  43.             {  
  44.                 printf("%s/n", argv[optind++]);  
  45.             }  
  46.        }  
  47.     return 0;  
  48. }  
  49. void usage(const char *p)  
  50. {  
  51.    printf("Usage: %s [-i infile] [-a] [-o outfile] [-v] [-h] [file]/n", p);  
  52. }  

执行结果:

./mygetopt file1 -i infile -a -o outfile -v -h file2

option i: infile

optind=4

 

option a :a

optind=5

 

option o: outfile

optind=7

 

option v: v

optind=8

 

Usage: ./mygetopt [-i infile] [-a] [-o outfile] [-v] [-h] [file]

optind=9

 

non-option arguments below:

file1

file2    



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

命令行程序选项解析函数—getopt 的相关文章

  • Linuxshell脚本之菜单以及函数

    目录 一 菜单 1 查看菜单格式 2 简单菜单小脚本 二 函数 1 作用 2 基本格式 3 查看函数 4 删除函数 5 函数的返回值 6 函数的传参数 7 函数变量的作用范围 8 递归 三 数组 1 定义数组格式 2 数组类型包括 四 总结
  • linux中jdk安装/java环境安装

    第一步首先下载java jdk jdk 8u144 linux x64链接 https pan baidu com s 1uvSB 7JP037AdZJPDdGF6A 提取码 mdat 然后使用工具将文件传输到linux上 然后将tar g
  • linux 中的 nohup 命令(设置后台进程): nohup: ignoring input and appending output to ‘nohup.out’

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 一 Linux 下使用 nohup Unix Linux下一般比如想让某个程序在后台运行 很多都是使用 在程序结尾来让程序自动运行 比如我们要
  • 虚拟机下为ubuntu添加硬盘

    1 在Vm中关闭Ubuntu 设置 中 添加新的硬件设备 选择Hard Disk 点击下一步 2 选择硬盘类型 可以选择IDE 或是SCSI 这里选择SCSI 3 选择虚拟新硬盘的位置 命名 Ubuntu2 vmdk 4 设定硬盘大小 随便
  • XAMPP 的安装配置(Linux 版)

    转载时请保留下面 以供大家加我MSN 增强交流 共同学习 姜庭华 msn jaimejth live cn 博客 http blog csdn net jaimejth 软件下载在以下网站 http www apachefriends or
  • 磁盘性能指标—IOPS、吞吐量及测试

    磁盘性能指标 IOPS 吞吐量及测试 IOPS 吞吐量 磁盘服务时间 最大IOPS的理论计算方法 IOPS Input Output Per Second 即每秒的输入输出量 或读写次数 是衡量磁盘性能的主要指标之一 IOPS是指单位时间内
  • eclipse的Toggle Block Selection Mode功能---列模式

    快捷键 Alf Shift A Toggle Block Selection Mode 块选择模式开关 用法 首先用快捷键或者toolbar打开选择模式 会出现一个十字 表明块选择模式已开启 选中要统一修改的块 可以从 剪贴板ctrl v替
  • linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置

    如果ping域名的时候出现ping unknown host xxx xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好 查看一下配置文件 etc resolv conf 里面是否有nameserver xxx x
  • Linux命令行中创建的软连接(ln -s)的无法移动问题,以及绝对路径和相对路径的概念

    最近刚开始学习鸟哥的Linux基础篇 昨天试验了其中的一些命令 发现在某一个目录下对某个目录创建的软连接在移动到另一个目录下之后就无法正常打开了 问了下同学 这个问题顺利的解决了 首先 在目录dir1下创建一个目录dir2 用到的命令是 j
  • Shell编程样例一篇

    Shell编程例子 来源 ChinaUnix博客 日期 2007 04 10 00 07 共有0条评论 我要评论 Bash编程实例 一 通过学习如何使用 bash 脚本语言编程 将使 Linux 的日常交互更有趣和有生产力 同时还可以利用那
  • ubuntu设置ssh登陆

    默认请况下 ubuntu是不允许远程登陆的 因为服务没有开 可以这么理解 想要用ssh登陆的话 要在需要登陆的系统上启动服务 即 安装ssh的服务器端 sudo apt get install openssh server 然后 启动服务
  • linux-三剑客(sed、awk、grep)

    三剑客sed awk grep 三剑客与正则表达式是什么关系呢 正则表达式 grep 文本过滤工具 sed 操作 过滤和转换文本内容的强大工具 组合多个表达式 引用 定界符 命令中字符 在sed中作为定界符使用 也可以使用任意的定界符 se
  • Shell 流程控制

    和Java PHP等语言不一样 sh的流程控制不可为空 如 以下为PHP流程控制写法
  • 查看Linux内核版本的命令

    方法一 命令 uname a 作用 查看系统内核版本号及系统名称 方法二 命令 cat proc version 作用 查看目录 proc 下version的信息 也可以得到当前系统的内核版本号及系统名称 补充说明 proc文件系统 它不是
  • Ubuntu上安装 Emacs 24的几种方法

    1 首选当然是在Ubuntu Software Center 中找或者 apt get install emacs 可惜的是只有emacs23版本的 所以此路不通 放弃 现在Ubuntu12 04开始已经有了Emacs24 不过还是不推荐
  • linux-快捷键

    linux快捷键 ctrl a 移动到行首 ctrl e 移动到行尾 ctrl u 删除光标之前的字符 ctrl k 删除光标之后的字符 ctrl l 清空屏幕终端内容 同于clear
  • shell提取字符串中的数字保存到变量中

    1 提取数字到变量 temp echo helloworld20180719 tr cd 0 9 echo temp 输出 20180719 2 重定向到文件 echo helloworld20180719 tr cd 0 9 gt mid
  • Linux Centos 配置 Docker 国内镜像加速

    在使用 Docker 进行容器化部署时 由于国外的 Docker 镜像源速度较慢 我们可以配置 Docker 使用国内的镜像加速器 以提高下载和部署的效率 本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速 步骤一
  • brew 安装使用 mysql、redis、mongodb

    在 Mac 生态中 brew 真是个万能神器 今天就来介绍一下怎么使用 brew 安装 mysql redis mongodb 以及如何使用 brew 启动 关闭 重启这些服务 前言 brew 常用命令 查看brew的版本 brew v 更
  • linux centos使用rz、sz命令上传下载文件

    一般情况下 我们会使用终端软件 如 XShell SecureCRT 或 FinalShell 来连接远程服务器后 使用 rz 命令上传本地文件到远程服务器 再解压发版上线 一 安转使用 系统 Linux CentOS 7 安装 rz 和

随机推荐

  • 基于CNN-LSTM模型: 用EEG自动诊断精神分裂症

    精神分裂症 SZ 会阻碍大脑发育 严重损害思想 情感表达以及对现实的感知 大多数研究表明大脑结构和功能异常会产生很大影响 不过目前导致SZ的原因仍不明确 据世界卫生组织报告 全世界近2100万人患有这种脑部疾病 开始受该疾病影响的平均年龄是
  • 排序--插入排序--(直接插入排序、希尔排序)

    文章目录 直接插入排序 希尔排序 直接插入排序 将一段有序数组 插入一个数 重新使它有序 最坏时间复杂度O N 2 逆序 最好时间复杂度O N 顺序有序 空间复杂度O 1 void InsertSort int a int n 0 end
  • Vue 中防止用户频繁点击按钮的优秀实践

    系列文章目录 文章目录 系列文章目录 前言 一 为什么要防止用户频繁点击按钮 二 优秀的防止用户频繁点击按钮的实践方法 1 禁用按钮 2 添加防抖函数 3 添加节流函数 总结 前言 在 Vue 开发中 我们常常会遇到用户频繁点击按钮的问题
  • 【Java笔记+踩坑】SpringBoot基础2——运维实用

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 SpringBoot程序的打包与运行回顾 1
  • 2023校招4399面试

    4399效率很高 笔试完第二天就面试了 腾讯会议面试的 表现比较拉跨 1 自我介绍 2 为什么做这个web服务器这个项目 当时说的是想学以致用一下 现在想想说具体什么作用更好吧 3 项目中一些难点 线程池 4 几种io多路复用的实现方式以及
  • JS,统计图表大全--二、柱形图(柱状图及条形图)Bar

    二 柱状图 Bar
  • An Introduction to Compressive Sensing 压缩感知教材

    rice大学压缩感知的书 想系统性学习CS的可以看看这本书 下载地址 http cnx org exports f70b6ba0 b9f0 460f 8828 e8fc6179e65f 5 12 pdf an introduction to
  • 利用commands模块执行Linux shell命令

    利用commands模块执行Linux shell命令 用Python写运维脚本时 经常需要执行linux shell的命令 Python中的commands模块专门用于调用Linux shell命令 并返回状态和结果 下面是command
  • umask命令

    命令格式 umask 模式 说明 创建文件或目录时的掩码 文件创建的权限默认为666 umask 而目录创建的权限是用777 umask 为什么文件和目录创建时候指定的权限不一样 因为666是777减去了文件的执行权限 也就是用777 11
  • IO网络编程面试题(2022)

    IO 网络编程 1 什么是 IO IO的定义 IO用于实现对数据的输入和输出操作 流是从起源到接受的有序数据 2 常用的 IO 类有哪些 1 字节流 FileInputStream FileOutputStream 2 字符流 FileRe
  • 解决pip install --upgrade pip 升级不成功

    问题描述 使用pip安装第三方模块的时候 提示我pip版本过低WARNING You are using pip version 21 0 1 however version 21 1 1 is available You should c
  • Nvidia TX2 刷机教程 JetPack-L4T-3.0-linux-x64.run

    前言 本教程特别针对刷机被墙的朋友 如果没有被墙 其实按照官方文档一步一步操作就行 这期间我参考了特别多的网页 也去nvidia官方论坛问过 其实截止到2019年2月16日 jetpack3 3 是可以很轻松的被装上的 主要是3 0被墙 而
  • 1. Python的特性和语法

    千里之行始于足下 大家好 我是茶桁 这里是我们 AI秘籍 的第一节 让我们先从Python来开始好好的打好基础 第一堂课 我们先从最基础的Python特性开始 当然 还有一些基本语法 上来就开始讲特性和语法 说明我们将会遗弃惯用的 环境搭建
  • java 获取linux mac_java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名...

    packagecom cloudssaas util importjava io BufferedReader importjava io IOException importjava io InputStreamReader import
  • abc计算机机房建设标准,ABC级数据中心机房建设要求

    ABC级数据中心机房建设要求 由会员分享 可在线阅读 更多相关 ABC级数据中心机房建设要求 7页珍藏版 请在人人文库网上搜索 1 ABC级数据中心机房建设要求一 根据数据中心机房最新设计规范GB50174 2008电子信息系统机房设计规范
  • 图像处理之高斯混合模型

    一 高斯混合模型 现有的图像中目标的分类常用深度学习模型处理 但是深度学习需要大量模型处理 对于明显提取的目标 常常有几个明显特征 利用这几个明显特征使用少量图片便可以完成图像目标分类工作 这里介绍使用高斯混合模型GMM处理图像 二 步骤
  • Python数据分析学习路径图 #CSDN博文精选# #IT技术# #学习路线# #系统化学习# #python#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • springboot框架在页面和postman访问可以debug进入方法,但是接收方接收到是404的问题

    重要性 在使用注解开发的过程中 如果遇到接口能够debug进去 但是接收方接到的是404 导致这种结果的原因是 restController 和 Conroller 这两个注解的导致的 RestController注解相当于 Respons
  • python 第三方库之openpyxl

    一次偶然的机会知道这个第三方库 然后看官方文档 在此记录下我的学习笔记 1 openpyxl openpyxl 是一个第三方库 可以读写excel 文件 2 安装 pip3 install openpyxl 3 如果你的excel文件中包含
  • 命令行程序选项解析函数—getopt

    转载请注明出处 http blog csdn net zhangyang0402 archive 2010 06 14 5671410 aspx 命令行工具下的参数选项有两种 长选项和短选项 短选项以 开头 后面跟单个字母 长选项以 开头