arguments and options and optarg in C

用C写一个命令行工具的话, 可能会经常用到argument和options.

例如 : 

1. ps -ewf 这里-ewf就是option.

2. ps -eo rs,cmd 这里 rs 和 cmd则是option -o 的 optarg

3. ls /root 这里/root则是ls命令的argument.

在C里面怎么应用呢?

使用到的是unistd.h, 

SYNOPSIS

       #include <unistd.h>

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

       extern char *optarg;

       extern int optind, opterr, optopt;

getopt 用于获取定义好的option 字符, 带冒号表示这个option有optarg. 在命令中调用option使用一个横杠.

optarg 是个字符指针.

optind 表示The variable optind is the index of the next element of the argv[] vector to be processed.

举个例子 : 

[root@db-172-16-3-150 zzz]# cat n.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char * argv[]) {
  int digoal;
  char *equipment="";
  char ch;
  int i;
  while((ch = getopt(argc, argv, "de:")) != EOF) {
    switch(ch) {
      case 'd':
        digoal = 1;
        break;
      case 'e':
        equipment = optarg;
        break;
      default:
        fprintf(stderr, "Unknown option: %s\n", optarg);
        return 1;
    }
  }
  if (digoal)
    fprintf(stdout, "yes -d used\n");
  if (*equipment)
    fprintf(stdout, "equipment is:%s\n", equipment);
  for(i=optind;i<argc;i++) {
    fprintf(stdout, "your argument %i is:%s\n", i, argv[i]);
  }
  fprintf(stdout, "your argument %i is:%s\n", 0, argv[0]);  //argv[0] 指命令本身.
  return 0;
}

结果

[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./n -d -e tank -- -1 a b c d e
yes -d used
equipment is:tank
your argument 5 is:-1
your argument 6 is:a
your argument 7 is:b
your argument 8 is:c
your argument 9 is:d
your argument 10 is:e
your argument 0 is:./n

注意如果把两个杠杠去掉会报错, 因为getopt()会一直检索, 直到遇到-- 结束. 它会吧-1 当成option.

[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./n -d -e tank -1 a b c d e
./n: invalid option -- 1
Unknown option: (null)

把-1 放在-e后面是没问题的, 因为-e 后面被任务是optarg.

[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./n -d -e -1 a b c d e
yes -d used
equipment is:-1
your argument 4 is:a
your argument 5 is:b
your argument 6 is:c
your argument 7 is:d
your argument 8 is:e
your argument 0 is:./n

空格是各个选项的分隔符 : 

[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./n -d -e a,b,c,d a b c d e
yes -d used
equipment is:a,b,c,d
your argument 4 is:a
your argument 5 is:b
your argument 6 is:c
your argument 7 is:d
your argument 8 is:e
your argument 0 is:./n
时间: 2024-11-05 05:36:43

arguments and options and optarg in C的相关文章

[翻译]JDK 8 兼容性指南

翻译官方文档,删除部分可忽略. 译者:坤谷,井桐,激酶 兼容性是一个复杂的问题. 本文介绍了Java平台潜在的三种不兼容问题: 源码: 源码兼容性问题关注Java源代码转换成class文件是否兼容,包括代码是否仍然可编译. 二进制: 在Java语言规范中,二进制兼容性定义为:"类的改变是二进制兼容的(或者不破坏二进制兼容性),是指如果改变前的类的二进制在链接时没有错误,那么改变后的类在链接时仍然没有错误." 行为 : 行为兼容性包括在运行时执行的代码的语义. 欲了解更多信息,请参阅Op

常用的JavaScript WEB操作方法分享

 这篇文章主要介绍了常用的JavaScript WEB操作方法分享,包含数组方法集.cookie方法集.url方法集.正则表达式方法集.字符串方法集.加密方法集.日期方法集等常用操作方法,需要的朋友可以参考下     数组方法集 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 4

转-Python optionParser模块的使用方法

Python  有两个内建的模块用于处理命令行参数: 一个是  getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是  optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. 示例 from optparse import OptionParser  parser = OptionParser()  parser.add_option("-p", "--pdbk&

【技术干货】听阿里云CDN安防技术专家金九讲SystemTap使用技巧

1.简介 SystemTap是一个Linux非常有用的调试(跟踪/探测)工具,常用于Linux 内核或者应用程序的信息采集,比如:获取一个函数里面运行时的变 量.调用堆栈,甚至可以直接修改变量的值,对诊断性能或功能问题非 常有帮助.SystemTap提供非常简单的命令行接口和很简洁的脚本语 言,以及非常丰富的tapset和例子. 2.何时使用 定位(内核)函数位置 查看函数被调用时的调用堆栈.局部变量.参数 查看函数指针变量实际指的是哪个函数 查看代码的执行轨迹(哪些行被执行了) 查看内核或者进

手机端轮播图插件

手机端轮播图实现:       对应插件:af.carousel.js 见附件   使用方法: Js代码   /***   *   * @param carouselId   * @param carousel_dotsId   * @param autoPlay : 是否自动播放轮播图   * @param isCache : 不传值默认为true   */   function carouselSetup(carouselId, carousel_dotsId, autoPlay, isCa

[Hadoop]Sqoop 1.4.2中文文档(一)之数据导入

一.Sqoop Help $ sqoop help usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Expor

node.js学习笔记(15) child_process(二)

难道是因为内容太长了吗?死活提交不了啊,只能分篇了... =============================================== child_process.execSync(): function execSync(/*command, options*/) { var opts = normalizeExecArgs.apply(null, arguments); var inheritStderr = opts.options ? !opts.options.std

python optparse命令解析模块

来源:http://www.cnblogs.com/pping/p/3989098.html?utm_source=tuicool&utm_medium=referral 来源:http://www.cnblogs.com/darkpig/p/5677153.html 来源:点击打开链接 Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命

使用Python编写类UNIX系统的命令行工具的教程_python

引言 您是否能编写命令行工具?也许您可以,但您能编写出真正好用的命令行工具吗?本文讨论使用 Python 来创建一个强健的命令行工具,并带有内置的帮助菜单.错误处理和选项处理.由于一些奇怪的原因,很多人并不了解 Python? 的标准库具有制作功能极其强大的 *NIX 命令行工具所需的全部工具. 可以这样说,Python 是制作 *NIX 命令行工具的最佳语言,因为它依照"batteries-included"的哲学方式工作,并且强调提供可读性高的代码.但仅作为提醒,当您发现使用 Py