linux命令行选项参数,Linux命令行选项及参数

本文详细介绍了C语言中处理命令行参数和选项的方法,包括`getopt`和`getopt_long`函数的使用。`getopt`用于处理短选项,而`getopt_long`不仅支持短选项还支持长选项。这两个函数可以解析命令行参数,如`ls -l -a`,并允许灵活定义选项格式。文章通过示例代码展示了如何在程序中解析和处理这些选项,包括选项的参数处理和错误处理。
摘要由CSDN通过智能技术生成

1、main函数参数形式

int main(int argc , char *argv[] , char *env[]);

//第一个参数argc代表命令行的参数个数

//第二个参数依次指向各个参数,如"ls -l",argv[0]指向"ls",argv[1]指向"-l",argv[2]为NULL

//第三个参数为当前进程环境变量列表

2、命令行参数识别

在命令行输入命令时,选项的位置是随意的,如ls -l -a 与ls -a -l的效果是一样的

2.1、getopt(int argc , char *argv[] , char *optstring)   引入头文件"unistd.h"

第一个参数、第二个参数同main函数的前两个参数,第三个参数optstring定义了选项和参数的形式

(1)单个字符表示该选项没有参数

(2)单个字符后面接单个冒号,表示该选项后面必定有参数,且以空格分隔选项和参数

(3)单个字符后面接双冒号,表示该选项后可以有参数也可以没有参数;若有参数,参数必须紧跟在选项后

如:

ab:c::

选项a没有参数;选项b有一个参数且用空格分隔;选项c可以有参数也可以没有参数,若有参数,参数必须紧跟在选项后

此外还有4个与getopt相关的全局变量

int optopt:存储未满足optstring规定的选项

char *optarg:指向当前选项的参数指针

int optind:确定选项和对应参数后,指向下一个argv参数

int opterr:若设为0,则getopt不想stderr输出错误信息

调用原理:

每次调用完getopt,都会返回对应的选项,使得optarg指向该选项对应的参数。若选项不满足optstring的规则,则返回‘?’,并将该选项存入optopt;若解析完毕则返回-1。

解析完毕后,getopt会重新排列argv中的参数,所有不符合要求的选项和参数被放到argv的最后(其中选项在前、参数在后),并使optind指向这些不符合要求的选项参数在argv中的起始下标。

#include

#include

int main(int argc ,char ** argv ,char ** env){

int res;

opterr=; //不显示错误信息

while((res = getopt(argc , argv , "ab:c::")) != -){

switch(res){

case 'a':

printf("option=a\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);

break;

case 'b':

printf("option=b\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);

break;

case 'c':

printf("option=c\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);

break;

case '?':

printf("option=?\toptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]);

break;

}

}

printf("OVER\noptarg=%s\toptopt=%c\toptind=%d\targv[optind]->%s\n",optarg,optopt,optind,argv[optind]); //打印三个全局变量最终值

int i = ;

printf("******************************************\n");

for(; i < argc ; i++){ //打印重新排列后的命令行参数

printf("%s\n",argv[i]);

}

}

sudo ./main -a -b bbb -c ccc -d ddd

option=a  optarg=(null)  optopt=  optind=2  argv[optind]->-b

option=b  optarg=bbb  optopt=  optind=4  argv[optind]->-c

option=c  optarg=(null)  optopt=  optind=5  argv[optind]->ccc

option=?  optarg=(null)  optopt=d  optind=7  argv[optind]->ddd

OVER

optarg=(null)  optopt=d  optind=6  argv[optind]->ccc

******************************************

-a

-b

bbb

-c

-d

ccc

ddd

2.2、getopt_long

它不仅能识别短选项(命令 -短选项),而且还支持长选项(命令 --长选项)。

int getopt_long(int argc , char **argv , char * shortOpt ,struct option * longOpt, int *index)   注意:struct option 要引入头文件”getopt.h“

前三个参数同getopt的参数,shortOpt定义的短选项及参数的形式。

第四个参数定义的是结构体option数组,

第五个参数记录长选项位于longOpt数组的下标,一般情况下设为NULL

struct option{

const char *name;  //长选项名称

int has_arg;  //0表示该选项没有参数,1表示必须有参数,2参数为可选

int *flag; //一般为NULL,则getopt_long返回val;否则,将val的值赋给flag所指向的整形变量,函数返回值为0

int val;  //一般设为长选项对应的短选项,若flag为NULL,则val作为函数的返回值。否则将val赋给flag所指向的变量

};

若不想支持短选项,则让shortOpt为”“空字符串即可,但不能设为NULL。

#include

#include

#include

int main(int argc , char **argv , char **env){

int res; //保存函数返回值

struct option longOption[]={ //定义长选项数组

{"help",,NULL,'h'},

{"version",,NULL,'v'},

{"output",,NULL,'o'},

{NULL,,NULL,}

};

opterr=; //不输出错误信息

int index; //长选项位于longOption的下标

while( - != (res = getopt_long(argc , argv , "hvo:",longOption ,&index))){

switch(res){

case 'h':

printf("option=help\n");

break;

case 'v':

printf("option=version\n");

break;

case 'o':

printf("option=output,output path=%s\n",optarg);

break;

case '?':

printf("error\n");

break;

}

printf("index in longOption is %d\n",index);

}

return ;

}

输出:

sudo ./main -h

option=help

index in longOption is -1218614280   //对于短选项,函数的第五个参数无效

sudo ./main -o /home/out

option=output,output path=/home/out

index in longOption is -1219220488

sudo ./main --version

option=version

index in longOption is 1

sudo ./main --output /home/out

option=output,output path=/home/out

index in longOption is 2

argparse - 命令行选项与参数解析(转)

argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing 译者:young ...

getopt:命令行选项、参数处理

在写shell脚本时经常会用到命令行选项.参数处理方式,如: ./test.sh -f config.conf -v --prefix=/home -f 为短选项,它需要一个参数,即config.co ...

【makefile】make程序的命令行选项和参数

Make命令参数的典型序列如下所示: make [-f makefile文件名][选项][宏定义][目标] 这里用[]括起来的表示是可选的.命令行选项由破折号“–”指明,后面跟选项,如: make – ...

脚本乐园 Shell中命令行选项和参数的处理

在Linux的Shell中怎样处理tail -n 10 access.log这样的命令行选项呢?这是被别人问起的一个问题,好好学习了一下,进行总结如下:在bash中,可以用以下三种方式来处理命令行参数 ...

【视频】Linux高级程序设计01&period;3命令行选项及参数

[课程笔记] [命令行参数] 选项:-l -a -i 参数:-l /home main 函数形式: int main(int argc, char *argv[]) main函数是有参数的,而且有返回 ...

argparse - 命令行选项与参数解析

argparse模块作为optparse的一个替代被添加到Python2.7.argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库 ...

python argparse模块:命令行选项及参数解析

位置参数:给一个例子: import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") ...

9、getopt的用法,被用来解析命令行选项参数

#include        extern char *optarg;  //选项的参数指针       extern int optind,   //下一次调用ge ...

命令行选项解析函数&lpar;C语言&rpar;:getopt&lpar;&rpar;和getopt&lowbar;long&lpar;&rpar;

命令行选项解析函数(C语言):getopt()和getopt_long() 上午在看源码项目webbench时,刚开始就被一个似乎挺陌生函数getopt_long()给卡住了,说实话这函数没怎么见过, ...

随机推荐

简化注解shh框架

找到上次我们搭建的SSH框架 浏览一下原始的applicationContext.xml文件中的部分配置.

git 项目初始化

1.在git服务器界面右上角“+” .create  new  project ,写上项目名字生成一个新的组 2.如果机器第一次与git 建立连接,需要让机器生成一个id_rsa和id_rsa.pub ...

实现Win7远程桌面关机和重启

通过远程桌面控制Win7系统时,菜单中没有关机和重启按钮, 1.方法1 关机 shutdown -s -t 0重启 shutdown -r -t 0 可以先打开运行框(Win+R键),输入上述命令即可 ...

Windows Server 2008防火墙问题及Sql Server2005用户登录问题

一.Windows Server 2008防火墙问题 1.  问题: 1.在 Windows 安全中心中单击“立即打开”以打开 Windows 防火墙时,会收到以下错误消息:安全中心无法打开 Wind ...

Django创建和配置文件

首先我们随便找一个文件 shift+鼠标右键 点击打开 Powershell 窗口 然后输入命令  django-admin startproject 项目名字 输入cd day   进入这个项目下 ...

【&period;NetCore学习】ubuntu16&period;04 搭建&period;net core mvc api 运行环境

查看linux内核版本 uname -a 打印结果 python@ubuntu:~$ uname -a Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed ...

JAVA按数字,字母排序,但不包括大小写和汉字排序

public class ABC { public static void main(String[] args) { new ABC().sortStringArray(); } public vo ...

spfa 判断负环 &lpar;转载&rpar;

当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

实战:mysql检查物理磁盘中的二进制日志文件是否有丢失

版权声明:日常札记,乐于分享 https://blog.csdn.net/yangzhawen/article/details/32103555 场景:有时候由于磁盘损坏或人为原因错误删除了磁盘中的二 ...

intent调用代码总结

进入联系人界面 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(People.CO ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值