使用getopt函数对命令行短形参进行处理

今天,在看man 9 style时见到了用来处理命令行短形参getopt函数,很是诧异 ——
要知道,我处理命令行参数都是用手动的!于是我如获至宝,赶紧学习学习。
getopt的原型被放在unistd.h中,它的原型是这样的:int
getopt(int argc, char * const argv[], const char
*optstring)
这里的argc,argv就是main函数的形参,需要调用是只要把main形参给传过去就ok了。后面的optstring是一个集合,包括了所有可能的短参数的结果,它的语法是这样的:
1.
单个字符
表示没有形参值的短形参(所谓的短形参就比如说gcc -c foo.c -o foo这里的"-c"就是一个没有形参值的短形参,后面的"-o
foo"就是有形参值的短形参。而--help之类的就是长形参,可以用getopt_long函数来处理),这种不带值的形参可以连写,比如"foo -c -d
-e"就可以写成"foo -cde",getopt照样可以识别
2. 单个字符加一个‘:‘符号
表示必须带值的短形参。比如在"gcc -c -o
foo foo.txt"中如果想要读取"-o foo"就可以写"o:"。该参数(在这里是foo)的指针赋给optarg。(这个特性是Linux
C的扩展)
3. 单个字符加两个‘:‘符号
表示可选值的短形参。比如在"gcc
-O3"中就存在一个可选值短形参-O,它的值为3。该参数(在这里是3)的指针同样赋给optarg。

我写了小程序,使用getopt函数根据形参对一个文本进行查找。

 1 #include <err.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <unistd.h>
5
6 static void usage(char *);
7
8 int
9 main(int argc, char **argv)
10 {
11 int ch;
12 int usageflag = 0;
13 char *source = NULL;
14 char *match = NULL;
15 char *progname = argv[0];
16
17 while ((ch = getopt(argc, argv, "hs:m:")) != -1)
18 switch (ch) {
19 case ‘s‘:
20 source = optarg;
21 break;
22 case ‘m‘:
23 match = optarg;
24 break;
25 case ‘h‘:
26 usageflag = 1;
27 break;
28 default:
29 warn("undefined arg %c\n", ch);
30 break;
31 }
32
33 if (usageflag != 1 && source != NULL && match != NULL)
34 printf("%s\n", strstr(source, match));
35 else
36 usage(progname);
37
38 return 0;
39 }
40
41 static void
42 usage(char *progname)
43 {
44 warnx("Usage: %s [-h] -s source -m match", progname);
45 }

getopttest.c

 1 src.c=getopttest.c
2 cflags=-O3
3 target.exe=getopttest
4 cc=gcc
5
6 all: $(target.exe)
7
8 $(target.exe):
9 $(cc) $(src.c) -o $(target.exe) $(cflags)
10
11 .PHONY: dist clean
12
13 ######################################################
14
15 source.d=.
16 target.tar=getopt.tar
17
18 dist: $(target.tar)
19
20 $(target.tar): clean
21 -rm *~
22 tar cf $(target.tar) $(source.d)
23
24 ######################################################
25
26 clean:
27 -rm $(target.exe) $(target.tar)

makefile

测试一下:

[[email protected] ~/getopt]$ make clean
rm getopttest
[[email protected]
~/getopt]$ make
gcc getopttest.c -o getopttest -O3
[[email protected]
~/getopt]$ ./getopttest -h
getopttest: Usage: ./getopttest [-h] -s source -m
match
[[email protected] ~/getopt]$ ./getopttest
getopttest: Usage:
./getopttest [-h] -s source -m match
[[email protected] ~/getopt]$ ./getopttest -s
"GNU IS NOT UNIX" -m "UNIX"
UNIX
[[email protected] ~/getopt]$ ./getopttest -s
"GNU IS NOT UNIX" -m "GNU"
GNU IS NOT UNIX
[[email protected] ~/getopt]$
./getopttest -s "GNU IS NOT UNIX" -m "IS"
IS NOT UNIX
[[email protected]
~/getopt]$ ./getopttest -s "GNU IS HORRIBLE" -m "IS"
IS
HORRIBLE
[[email protected] ~/getopt]$ make clean
rm getopttest

时间: 2024-10-05 04:27:21

使用getopt函数对命令行短形参进行处理的相关文章

Linux getopt/getopts解析命令行参数教程

一.说明 shell中获取参数可以直接使用$1.$2等形式来获取,但这种方式有明显的限制:每个参数的位置是固定的.比如如果在设计上$1是ip地址$2是端口,那在执行时就必须第一个参数是ip第二个参数是端口而不能反过来. shell提供了getopt和getopts来解析参数,getopt比getopts功能强一些getopts比getopt简单一些:总体而言getopt和getopts都差强人意. 二.使用getopt解析参数 getopt比getopts强一些复杂一些:能在命令行中单独使用.支

getopt(分析命令行参数)

ref:http://vopit.blog.51cto.com/2400931/440453 相关函数表头文件 #include<unistd.h>定义函数 int getopt(int argc,char * const argv[ ],const char * optstring);函数说明 getopt()用来分析命令行参数.参数argc和argv是由main()传递的参数个数和内容.参数optstring 则代表欲处理的选项字符串.此函数会返回在argv 中下一个的选项字母,此字母会对

getopt_long函数解析命令行参数

转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用getopt来实现的. 在Linux下使用getopt写程序是一种比较cool的事情,下面来简单的介绍一下getopt的使用. === getopt使用 === 在讨论参数处理之前,我们先明确两个概念:选项.选项参数gcc -g -o test test.c我们经常使用上面的命令来编译程序,这里g和

program_options禁止命令行短参数

典型的 boost program_options的用法如下: #include <boost/program_options.hpp> using namespace boost::program_options; using namespace std; int main(int argc, char* argv[]) // 需要命令行参数 { int intValue; options_description opts("Mysql performance options&qu

UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串

lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串.其声明如下, #include <stdlib.h> int system(const char *cmdstring); system 函数在其实现中调用了 fork.exec 和 waitpid 函数.system 函数调用 fork 函数创建子进程,然后由子进程调用’/bin/sh -c cmdstring’ 来执行命令行参数 cmdstring,此命令执行完后便返回调用的进程

第33课 main函数与命令行参数

1. main函数的概念 (1)C语言中main函数称之为主函数 (2)一个程序是从main函数开始执行的 [编程实验]main函数的原型究竟是什么 //以下四个main函数都是合法的 //第1种 //main() //{ //} //第2种 //void main() //{ //} //第3种:——标准的入口函数 int main() { return 0; } //第3种:——标准的入口函数 //int main() //{ // //没写返回值 //} [思考]为什么编译器支持那么多种不

C之main函数和命令行参数(三十)

我们知道在 C 语言中,程序是从 main 函数开始运行的,我们称其为主函数.我们来看看下面几种 main 函数定义正确吗? 那么 main 函数的原型到底是什么呢?我们来看看编译器怎么说,我们分别编译下四种 main 函数的形式,经过编译后,程序可以编译通过并且执行完成.那么最标准的 main 函数的原型是上面的第四种,main 函数是操作系统调用的函数,操作系统总是将 main 函数作为应用程序的开始并且将 main 函数的返回值作为应用程序的退出状态.那么 C 编译器为什么要支持这么多不同

使用mian函数的命令行参数

使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数"-a"选项执行加法,"-s"选项执行减法,"-m"选项执行乘法,"-d"选项执行除法,后面两个参数为操作数. #include <stdio.h> #include <assert.h> #include <string.h> enum JUDGE                 {  RIGHT,  ERROR

getopt函数的使用——分析命令行参数

getopt(分析命令行参数) getopt(分析命令行参数) 短参数的定义 返回值 范例 getopt_long 相关函数表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ],const char * optstring); 函数说明 getopt()用来分析命令行参数.参数argc和argv是由main()传递的参数个数和内容.参数optstring 则代表欲处理的选项字符串.此函数会返回在argv中下一