命令参数

在linux下, shell命令的参数分两种情况:

a.参数需要附加信息, 如"wget http://www.abc.com/1.zip -o 1.zip"

b.参数不需要附加信息, 如"ls -l"

有点像英语中的及物动词和不及物动词

getopt

#include <unistd.h>
int getopt(int argc, char * const argv[], const char * optstring); extern char *optarg; //指向参数的附加信息
extern int optind; // 初始化值为1,下一次调用getopt时,从optind存储的位置重新开始检查选项。
extern int opterr; // 初始化值为1,当opterr=0时,getopt不向stderr输出错误信息。
extern int optopt; // 当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,
// 该选项存储在optopt中, getopt返回'?’。

getopt前两个参数就是main函数里的两个参数

optstring是一个字符串包含需要捕获的参数,例"o:l"表示要捕捉o和l这两个参数

  • 后面带冒号的参数表示该参数有附加信息, 附加信息可通过optarg获取
  • 后面不带冒号的参数表示不带附加信息
  • 有些参数后面会带两个冒号, 表示附加信息可有可无, 但是如果有的话附加信息与参数之间不能有空格
  • 如果参数不在获取的字符串中, optarg返回一个问号, 同时getopt会输出错误信息, 可指定opterr=0来取消错误信息的输出

optind:

默认值为1, 即初始位置是a.out后面跟的第一个参数

假设当前optstring="a:b", 每调用一次getopt函数, optind就向后移动一次, 最后停留在第一个非optstring参数和非参数附加信息的参数上.

当遇到-b时, optind+=1, 即向后移动一位

当遇到-a时, optind+=2, 因为-a还会带一个附加信息

例如: a.out -a arg -b ...(不带-的其它任意参数), 循环执行完分析后, optind=4, 即停留在非optstring及其附加信息的参数上

例子

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char *argv[]){
int ch;
opterr=0;
while((ch=getopt(argc,argv,"o:l")) != -1){
switch(ch){
case 'o':
printf("option -o : %s\n",optarg); break;
case 'l':
printf("option -l : l\n"); break;
default:
printf("unknown option: %c\n",ch);
}
}
return 0;
}

测试:

a.out -o arg

a.out -l

a.out -lo arg //多个参数一起写时, 不及物参数写前面

命令行参数的处理函数getopt的更多相关文章

  1. Shell 参数(2) --解析命令行参数工具:getopts/getopt

    getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...

  2. 如何让python脚本支持命令行参数--getopt和click模块

    一.如何让python脚本支持命令行参数 1.使用click模块 如何使用这个模块,在我前面的博客已经写过了,可参考:https://www.cnblogs.com/Zzbj/p/11309130.h ...

  3. 如何获取PHP命令行参数

    使用 PHP 开发的同学多少都会接触过 CLI 命令行.经常会有一些定时任务或者一些脚本直接使用命令行处理会更加的方便,有些时候我们会需要像网页的 GET . POST 一样为这些命令行脚本提供参数. ...

  4. [Objective-C语言教程]命令行参数(23)

    执行时,可以将一些值从命令行传递给Objective-C程序. 这些值称为命令行参数,很多时候它们对程序很重要,特别是当想要从外部控制程序而不是在代码中对这些值进行硬编码时就很有用了. 命令行参数使用 ...

  5. C和指针--命令行参数

    1.命令行参数 C程序的main函数具有两个形参,第1个通常称为argc,它表示命令行参数的数目.第2个称为argv,它指向一组参数值.由于参数的数目并没有内在的限制,所以argv指向这组参数值(本质 ...

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

    getopt(分析命令行参数) getopt(分析命令行参数) 短参数的定义 返回值 范例 getopt_long 相关函数表头文件#include<unistd.h> 函数声明int g ...

  7. 命令行参数解析函数getopt和getopt_long函数【转】

    原文地址:http://blog.csdn.net/cashey1991/article/details/7942809 getopt和getopt_long函数   平时在写程序时常常需要对命令行参 ...

  8. [转]Python 命令行参数和getopt模块详解

    FROM : http://www.tuicool.com/articles/jaqQvq 有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Pyt ...

  9. Python 命令行参数和getopt模块详解

    有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的).在C语言里,m ...

随机推荐

  1. 每天一个Linux命令(1):ls命令

    转自http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html ls命令是Linux下最常用的命令.ls命令就是list的缩写,缺省下ls ...

  2. 怒刷DP之 HDU 1114

    Piggy-Bank Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S ...

  3. hdu 3938 并查集

    思路:这题的出题人是不是语文不行啊,题目意思说不清楚. 知道是求存在路径的点对数后,用并查集每次记录集合中点的数目,很容易就解决了. #include<set> #include<c ...

  4. 转: app端数据库(性能高) realm (ios, android 均支持)

    转:  http://ios.jobbole.com/85041/ 移动端数据库新王者:realm 2016/05/14 · iOS开发 · 数据库 分享到:0 原文出处: 没故事的卓同学(@没故事的 ...

  5. C#的三大特性

    每个新手基本上都知道C#的三大特性,但是今天我给自己总结了一下这三大特性 1.封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中".在面向对象程序设计方法论中,封装是为 ...

  6. 递归小Demo

    public class demo5 { public static void main(String[] args) {        //初始值为100         int n = 100;  ...

  7. ruby学习--block

    #当前块 class Block def a_method return yield if block_given? 'no block' end end obj=Block.new puts &qu ...

  8. Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 1

    Your ASP.NET MVC application needs reports. What do you do? In this article, I will demonstrate how ...

  9. Android之画廊点击内容显示

    package com.example.Gallery; import com.example.Gallery.R; import android.os.Bundle; import android. ...

  10. OSPF系列

    实验一.点对点链路上的OSPF 拓扑图 1. 首先配置好路由器R1接口地址和回环地址 2. 配置路由器R2的接口地址和回环地址 3. 配置路由器R3的接口地址和环回地址 4. 配置R1的OSPF协议 ...