Linux/Uinx 系统编程:getopt()函数用法

2024-01-27 01:44

本文主要是介绍Linux/Uinx 系统编程:getopt()函数用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux/Uinx 系统编程:getopt()函数用法

getopt()

函数描述
getopt()函数是用来分析命令行参数的,该函数由Unix标准库提供,包含在<unistd.h>头文件中。

函数原型

#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

各参数说明

  • argc:通常由main函数直接传入,表示参数的数量。
  • argv:通常也由main函数直接传入,表示参数的字符串变量数组。
  • optstring:由所有合法的选项字符组成的字符串。比如你的程序允许的选项是 -E-n,那么optstring的值就是"En"

执行过程
当给定getopt()命令参数的数量 (argc)、指向这些参数的数组 (argv) 和选项字串 (optstring) 后,getopt()将返回第一个选项,并设置一些全局变量。使用相同的参数再次调用该函数时,它将返回下一个选项,并设置相应的全局变量。如果不再有可识别的选项,将返回-1,此任务就完成了。

底层实现
getopt()函数通过解析命令行参数,返回找到的下一个短选项,如果遇到无法识别的选项则返回’?'。当没有更多短选项时它返回-1,并且设置全局变量optind的值指向argv中所有段选项之后的第一个元素。

执行示例

#include <stdio.h>
#include <unistd.h>int main (int argc, char **argv) {int i;int option;/* parse short options */while ((option = getopt(argc, argv, "bEnsTv")) != -1) {switch (option) {case 'b':puts("Put line numbers next to non-blank lines");break;case 'E':puts("Show the ends of lines as $");break;case 'n':puts("Put line numbers next to all lines");break;case 's':puts("Suppress printing repeated blank lines");break;case 'T':puts("Show tabs as ^I");break;case 'v':puts("Verbose");break;default: /* '?' */puts("What's that??");}}/* print the rest of the command line */puts("------------------------------");for (i = optind; i < argc; i++) {puts(argv[i]);}return 0;
}

这个演示程序没有实现cat命令的所有选项,但它只是能够解析命令行。每当发现一个合法的命令行选项,它就打印出相应的提示消息。

返回值
getopt()函数在成功解析一个选项时返回该选项的字符(因为字符可以转为整数)。若解析完毕,则返回-1。

执行结果
执行结果取决于getopt()函数是否成功解析了所有的命令行选项。如果成功,那么所有的命令行选项将被解析,如果失败,那么getopt()函数将返回’?'。

optarg

optarg是一个全局变量,用于存储命令行参数的值。它通常与getopt函数一起使用,用于解析命令行参数。getopt函数可以帮助我们解析命令行参数,并将其转换为可用的选项和参数。而optarg则用于存储选项的参数值。

例如,如果我们有一个命令行工具,它接受一个选项-a,该选项需要一个参数,我们可以使用getoptoptarg来获取这个参数。当我们在命令行中运行tool -a argument时,getopt函数会解析选项-a,并将argument的值存储在optarg中。

下面举个例子方便getoptoptarg的关系和理解:

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[]) {int opt;while ((opt = getopt(argc, argv, "a:")) != -1) {switch (opt) {case 'a':printf("Option -a has argument %s\n", optarg);break;default:printf("Unknown option\n");}}return 0;
}

在上面的例子中,定义了一个选项-a,该选项需要一个参数(由a:表示)。当我们运行./program -a argument时,getopt函数会解析选项-a,并将argument的值存储在optarg中。然后,我们可以在程序中使用这个值。。

这篇关于Linux/Uinx 系统编程:getopt()函数用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/648698

相关文章

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con