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

相关文章

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在