来源:微信公众号「编程学习基地」

@

argc,argv是什么

如果你是一个 Linux 开发者,那么你一定需要给应用程序传递参数。

刚接触C语言的童鞋,学的第一个程序一定是这样的

#include<stdio.h>
int main()
{
printf("hello world\n");
}

接触完 Linux 下C语言编程的童鞋,他会这样做

#include<stdio.h>
int main(int argc,char*argv[])
{
printf("argc:%d,argv[0]:%s\n",argc,argv[0]);
}

这个argc,argv有什么用?,先看下输出结果

# ./main
argc:1,argv[0]:./main

我们传递一个参数看看

# ./main -v
argc:2,argv[0]:./main

可以大概猜一下,argc跟命令行参数数量有关,argv跟命令行参数有关

修改下程序试着获取传递的参数

#include<stdio.h>
int main(int argc,char*argv[])
{
for(int index=0;index<argc;index++){
printf("argc:%d, argv[%d]:%s\n",index,index,argv[index]);
}
}

测试一下效果

# ./main
argc:0, argv[0]:./main
# ./main -p
argc:0, argv[0]:./main
argc:1, argv[1]:-p
# ./main -p 80
argc:0, argv[0]:./main
argc:1, argv[1]:-p
argc:2, argv[2]:80

这次可以确定了,argc是传递给应用程序的参数个数,argv是传递给应用程序的参数,且第一个参数为程序名。

如何解析程序参数

既然argc,argv可以传递参数,那我们如何分析命令行参数?

这里有个函数给大家介绍下

#include <unistd.h>
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

函数说明:getopt()用来分析命令行参数。

1、参数argc 和argv 是由main()传递的参数个数和内容

2、参数optstring 则代表准备处理的选项字符串

“选项”是什么?

在linux下大家都用过这样一条指令吧:gcc -o main main.cpp

这条指令中的 -o 就是命令行的选项,后面的 main-o 选项所携带的参数

有些选项是不用带参数的,而这样不带参数的选项可以写在一起,例如 rm -rf

"选项字符串"是什么

先看例子吧,"a:b:cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。

冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数,没有参数就会报错。

参数的输入形式 -p80 或者 -p 80,都表示 80 是 -p 的参数。

两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数。

需要注意的是两个冒号之间不能有空格。

解析参数

了解完选项和选项参数之后就是通过 getopt 这个函数解析参数了

在此之前了解一下几个全局参数

extern char *optarg; 用来保存选项的参数

extern int optind 用来记录下一个检索位置

opterr 是否将错误信息输出到stderr,为0时表示不输出

optopt 保存的是无法识别的选项

大概了解完之后,我们的示例程序如下

#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[])
{
int optch = 0;
while((optch = getopt(argc, argv, "a:b:cd::e")) != -1)
{
// printf("optind: %d\n", optind); //下一个检索位置,即选项的参数位置
switch (optch)
{
case 'a':
printf("-a %s\n", optarg);
break;
case 'b':
printf("-b %s\n", optarg);
break;
case 'C':
case 'c':
printf("-c %s\n", optarg);
break;
case 'd':
printf("d:%s\n", optarg);
break;
case 'e':
printf("-e %s\n", optarg);
break;
case '?':
printf("Unknown option: %c\n",(char)optopt); //表示不在选项字符串optstring中的选项
break;
default:
break;
}
}
// printf("opterr:%d\n",opterr); //opterr表示是否将错误信息输出到stderr,为0时表示不输出
}

测试程序的选项字符串是a:b:cd::e ,对应的是几个case标签,执行程序分别验证下

a和b有一个 : ,所以a,b选项后面必须携带参数

# ./main -a test
-a test
# ./main -b
./main: option requires an argument -- 'b'
Unknown option: b

不携带参数的话就会无法识别参数

c和e没有 : ,所以 c 选项就类似于 -version 一类的选项

# ./main -c
-c (null)
# ./main -c test
-c (null)

d有两个: ,所以d选项的参数是可选的,但是要注意参数与选项之间不能有空格

# ./main -dtest
d:test
# ./main -d test
d:(null)

Linux基础知识科普就介绍到这里,下一期是关于文件操作的。

Linux argc,argv详解的更多相关文章

  1. c语言中命令行参数argc,argv[]详解

    main(int argc,char *argv[ ]) 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[ ...

  2. opencv中 int main(int argc,char* argv[])详解

    opencv中  int main(int argc,char* argv[])详解 argc是命令行总的参数个数     argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数     ...

  3. 关于int main(int argc,char* argv[])详解

    平时在VS的环境下,主函数总会看到这两个参数,今天突然很想知道这两个参数的原理以及作用,因此查了下资料.真心受教了. 下面的博文是在百度空间看一位大神的,原文链接:http://hi.baidu.co ...

  4. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  5. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  6. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  7. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  8. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  9. linux cat 命令详解

    linux cat 命令详解 http://linux.chinaunix.net/techdoc/system/2007/11/16/972467.shtml adb shell su //这个不一 ...

  10. 【初级】linux rm 命令详解及使用方法实战

    rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就 ...

随机推荐

  1. RabbitMQ之消息模式2

    消费端限流 什么是消费端的限流? 假设一个场景,首先,我们RabbitMQ服务器有上万条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法 ...

  2. Junit5快速入门指南-3

    Fixtures 是测试中非常重要的一部分.他们的主要目的是建立一个固定/已知的环境状态以确保 测试可重复并且按照预期的方式运行.比如在app测试中 基类@BeforeClass 配置初始化,初始化d ...

  3. Vue Abp vNext用户登录(Cookie)

    因为Abp vNext没找到Vue的模板,网上也没找到相关vNext的例子,只能自己试着写写,asp.net core abp vue都是刚学不久,所以很粗糙也可能有错误的地方,如果您看到请指正,谢谢 ...

  4. python库--pandas--DataFrame

    转换    索引,迭代    运算符    功能应用,分组及窗口    计算/描述统计 重新索引/选择/标签操作    缺失数据处理    形状变换/排序/转置 组合/加入/合并    时间序列相关  ...

  5. composer 包 slim使用案例,一个简单的路由解决方案

    nginx配置文件修改 location / { try_files $uri /index.php$is_args$args; } 设置好nginx伪静态,把所有的请求方式都转向到index.php ...

  6. 动态规划精讲(一)A单串

    单串 单串 dp[i] 线性动态规划最简单的一类问题,输入是一个串,状态一般定义为 dp[i] := 考虑[0..i]上,原问题的解,其中 i 位置的处理,根据不同的问题,主要有两种方式: 第一种是 ...

  7. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  8. Android View post 方法

    解析View.post方法.分析一下这个方法的流程. 说起post方法,我们很容易联想到Handler的post方法,都是接收一个Runnable对象.那么这两个方法有啥不同呢? Handler的po ...

  9. 【PHP数据结构】图的应用:最短路径

    上篇文章的最小生成树有没有意犹未尽的感觉呀?不知道大家掌握得怎么样,是不是搞清楚了普里姆和克鲁斯卡尔这两种算法的原理了呢?面试的时候如果你写不出,至少得说出个大概来吧,当然,如果你是要考研的学生,那就 ...

  10. Jmeter扩展组件开发(7) - 自定义java请求的开发

    CODE package com.demo;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.ja ...