- 浏览: 49944 次
- 性别:
- 来自: 北京
文章分类
Linux选项解释-getopt和getopt_long函数
一、命令行简介
解释分析命令行通常是所以程序的第一个任务,C语言通过argc和argv参数来访问它的命令行参数。
最简单的命令行处理技术可以通过if判断来表示,如下例:
if(argc>1 &&argv[1][0] == ‘ - ‘ &&argv[1][1] == ‘ h ’ ) //判断命令行参数是否为-n
{
do _ some thing();
}
这样处理简单有序的命令行还可以,对于复杂的命令行处理显得有心无力,于是GNU提供两个函数专门用来处理命令行参数:getopt和getopt_long。
二、getopt函数
getopt()函数声明如下:
#include <unistd.h> Int getopt(int argc, char *const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt;
说 明:函数中的argc和argv通常直接从main()到两个参数传递而来。optsting是选项参数组成的字符串,如果该字符串里任一字母后有冒号, 那么这个选项就要求有参数,optarg就是选项参数。optind是当前索引,optopt用于当发现无效选项字符的时候,getopt函数或者返回 “?”或者返回“:”字符,并且optopt包含了所发现的无效选项字符。
如果optstring参数的第一个字符是冒号,那么getopt会根据错误情况返回不同的字符,当错误是无效选项,getopt返回“?”,当错误是缺少选项参数,getopt返回“:”。
注:GNU getopt()第三个特点是optstring中的选项字符后面接两个冒号,就允许该选项有可选的选项参数。在选项参数不存在的情况下,GNU getopt()返回选项字符并将optarg设置为NULL。
例子:
#include <stdio.h> #include <unistd.h> #include <getopt.h> char *para = ":ab:c"; int main(int argc, char *argv[]) { int oc = -1; char *b_input = NULL; while((oc = getopt(argc, argv, para)) != -1) { switch(oc) { case 'a': printf("input para is a\n"); break; case 'b': b_input = optarg; printf("input para is b,and optarg is %s\n", b_input); break; case 'c': printf("input para is c\n"); break; case ':': printf("option %c requires an argument\n",optopt); break; case '?': default: printf("option %c is invalid:ignored\n",optopt); break; } } return 0; }
编译:
[root@heguangwu projects]# gcc -o getopt_ex getopt_ex.c
运行:
[root@heguangwu projects]# ./getopt_ex -a
input para is a
[root@heguangwu projects]# ./getopt_ex -a -b
input para is a
option b requires an argument
[root@heguangwu projects]# ./getopt_ex -d
option d is invalid:ignored
三、getopt_long函数
getopt_long用来处理长选项,使用 man 3 getopt_long ,得到其声明如下:
#include <getopt.h> int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
前三个参数与getopt相同,下一个参数是指向数组的指针,这个数组是option结构数组,option结构称为长选项表,其声明如下:
struct option { const char *name; int has_arg; int *flag; int val; };
结构中的元素解释如下:
const char *name :选项名,前面没有短横线
int has_arg:描述长选项是否有参数,其值见下表
符号常量 |
数值 |
含义 |
no_argument required_argument optional_argument |
0 1 2 |
选项没有参数 选项需要参数 选项参数是可选的 |
int *flag:
如果该指针为NULL,那么getopt_long返回val字段的值;
如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0
int val:
如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;
#include <stdio.h> #include <unistd.h> #include <getopt.h> char *para = ":ab:cf:v"; int do_all = 0; int do_help = 0; int do_version = 0; char *file = NULL; struct option longopt[] = { {"all", no_argument, &do_all, 1}, {"file", required_argument, NULL, 'f'}, {"help", no_argument, &do_help, 1}, {"version", no_argument, &do_version, 1}, {"bob", required_argument, NULL, 'b'}, {0, 0, 0, 0}, }; int main(int argc, char *argv[]) { int oc = -1; char *b_input = NULL; while((oc = getopt_long(argc, argv, para, longopt, NULL)) != -1) { switch(oc) { case 'a': printf("input para is a\n"); break; case 'b': b_input = optarg; printf("input para is b,and optarg is %s\n", b_input); break; case 'c': printf("input para is c\n"); break; case 'v': printf("input para is v\n"); break; case 'f': printf("input para is f\n"); file = "hello world"; break; case 0: break; case ':': printf("option %c requires an argument\n",optopt); break; case '?': default: printf("option %c is invalid:ignored\n",optopt); break; } } printf("do_all is %d\n",do_all); printf("do_help is %d\n",do_help); printf("do_version is %d\n",do_version); printf("do_file is %s\n",file); printf("bob is %s\n", b_input); return 0; }
执行的结果: 只显示关键结果
[root@heguangwu projects]# ./opt_ex2 -a
input para is a
[root@heguangwu projects]# ./opt_ex2 --all
do_all is 1
[root@heguangwu projects]# ./opt_ex2 -f h
input para is f
do_file is hello world
[root@heguangwu projects]# ./opt_ex2 --bob aa
input para is b,and optarg is aa
bob is aa
[root@heguangwu projects]# ./opt_ex2 -b aa
input para is b,and optarg is aa
发表评论
-
关键字auto、static、register、const、volatile 、extern
2009-07-08 15:03 1667关键字auto、static、regist ... -
C语言传值操作
2009-06-30 20:56 1517C语言传值操作 C语言中的函数参数传递都是传 ... -
C语言中的运算符及其优先级
2009-06-30 20:05 1326C语言中的运算符及其优先级 优先级 ... -
POSIX 线程详解(3)
2009-06-29 17:33 1036POSIX 线程详解(3) —使 ... -
POSIX 线程详解(2)
2009-06-29 17:16 1487POSIX 线程详解(2) ——称作互斥对象的小玩意 ... -
POSIX 线程详解(1)
2009-06-29 15:50 828POSIX 线程详解(1) ——一种支持内存共享的简捷工具 ... -
使用 getopt() 进行命令行处理
2009-06-16 11:32 764使用 getopt() 进行命令行处理 2006 年 5 ... -
getopt函数和getopt_long函数学习笔记
2009-06-16 11:31 1397getopt函数和getopt_long函数学习笔记 ... -
Linux命令行程序设计
2009-06-16 11:09 1002Linux命令行程序设计 ...
相关推荐
在Linux和Unix-like操作系统中,命令行参数的解析是一个常见的任务,`getopt`函数库提供了处理这种问题的标准方法。`getopt`是C语言中用于解析命令行选项的一个库函数,它允许程序以结构化的方式处理命令行参数。...
`getopt` 函数是C标准库的一部分,通常用于解析命令行参数,而`getopt_long` 是一个扩展功能,提供更方便的方式来处理长选项。 `getopt.h` 文件包含了 `getopt` 函数的声明。这个函数主要用于处理命令行参数,它...
GNU libc提供了getopt和getopt_long用于解析命令行参数,使用方便,但是windows环境没有提供。故将GNU libc提供的源码稍加修改,整理出了windows下可用的getopt和getopt_long。
win10 vs2019下的 getopt及getopt_long getopt/getopt_long函数是GNU C中的函数
`getopt` 是一个库函数,用于解析程序启动时的命令行选项,而 `getopt_long` 是 `getopt` 的扩展版本,增加了对长选项的支持,使得命令行参数的使用更加灵活和易读。 `getopt.h` 是头文件,包含了 `getopt` 函数的...
`getopt`和`getopt_long`函数是C语言标准库中用于解析命令行参数的两个重要工具,它们能帮助我们方便地获取和处理用户在执行程序时传递的参数。 `getopt`函数是最基础的命令行参数解析函数,它按照一定的顺序(通常...
Linux中的`getopt_long`函数是用来解析命令行选项的一个标准工具,它可以帮助程序员方便地处理命令行参数。本文将深入探讨`getopt_long`的用法及其相关知识点。 首先,`getopt_long`函数通常在编写需要处理命令行...
在Linux系统编程中,`getopt`和`getopt_long`是两个非常重要的命令行选项解析函数,它们帮助开发者处理程序启动时的命令行参数。这两个函数由GNU C库提供,广泛应用于各种C语言编写的命令行工具和应用程序中。在...
在C编程中,`getopt()` 和 `getopt_long()` 是两个非常重要的函数,用于解析命令行选项。它们主要用于处理程序启动时用户输入的一系列参数,例如 `-h`(帮助)或 `-o`(带有参数的选项)。这些函数是C标准库的一部分...
getopt_long支持长选项的命令行解析,函数中的参数argc和argv通常直接从main()的两个参数传递而来。optstring是选项参数组成的字符串。 字符串optstring可以下列元素: 1. 单个字符,表示选项, 2. 单个字符后接一个...
`getopt()`函数是C语言中用于解析命令行参数的标准函数,主要应用于Unix/Linux系统,也可以在其他支持C语言的环境中使用。它简化了对带有选项和参数的命令行输入的处理,使得程序能够优雅地解析和理解用户提供的...
在Linux系统中,getopt是一个常用的命令行参数解析函数,广泛应用于各种命令行工具和脚本。这个函数允许程序员按照标准格式处理命令行参数,使得程序的参数化更加灵活和标准化。getopt函数的源代码对于理解其工作...
在Linux和UNIX系统中,命令行参数的处理是程序设计中的一个重要部分,`getopt`函数就是用于这个目的的关键工具。这个"11-getopt.rar"压缩包很可能包含的是一个关于`getopt`函数的源码副本或者示例程序,供学习者理解...
纯Bash实现的GNU getopt是Linux和Unix系统中命令行参数解析的一种解决方案。在Linux环境中,getopt函数通常用于解析命令行选项,它遵循POSIX标准,并在C语言中实现。然而,`pure-getopt`项目提供了一个完全用Bash...
在Linux和Unix-like操作系统中,命令行选项是程序接收参数的一种常见方式,它们通常以短格式(如`-a`)或长格式(如`--option`)出现。`getopt_long()`函数是GNU C库提供的一种处理命令行选项的工具,特别适合于解析...
`getopt(3)`是Unix和类Unix系统中用于解析命令行选项的一个函数,它允许程序在处理参数时识别带有短划线(-)或双短划线(--)[1]的选项,并可以接受选项后的值。`Go-getopt`库在Go中实现了类似的功能,为Go开发者提供了...
Linux系统提供了许多函数用于解析命令行参数,其中getopt_long函数和getopt_long_only函数是较为常用的两个函数。这两个函数的作用是帮助程序员处理输入的命令行参数,并解析出程序需要的参数值。本文将详细介绍...
在Windows操作系统中,通常开发环境使用的是MSVC (Microsoft Visual C++) 或者其他与Windows API紧密集成的工具,而这些工具并不直接支持Linux中的`getopt`、`getopt_long`和`getopt_long_only`函数。这些函数是用于...