zoukankan      html  css  js  c++  java
  • Linux argc,argv详解

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

    @

    argc,argv是什么

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

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

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

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

    #include<stdio.h>
    int main(int argc,char*argv[])
    {
        printf("argc:%d,argv[0]:%s
    ",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
    ",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
    ", optind); //下一个检索位置,即选项的参数位置
    		switch (optch)
    		{
            case 'a':
                printf("-a %s
    ", optarg);
                break;
            case 'b':
                printf("-b %s
    ", optarg);
                break;
            case 'C':
            case 'c':
                printf("-c %s
    ", optarg);
                break;
            case 'd':
                printf("d:%s
    ", optarg);
                break;
            case 'e':
                printf("-e %s
    ", optarg);
                break;
            case '?':
            printf("Unknown option: %c
    ",(char)optopt);    //表示不在选项字符串optstring中的选项
                break;
            default:
                break;
    		}
    	}
        // printf("opterr:%d
    ",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基础知识科普就介绍到这里,下一期是关于文件操作的。

  • 相关阅读:
    三级联动下拉菜单1
    IP地址查询接口及调用方法
    实现简单的网页拖拽效果
    [转载]PHP如何获取客户端真实IP
    mysql(二)连接查询
    php exec 执行php脚本
    PHP-将某一目录下文件压缩成zip格式
    从读书时代想我的程序之路
    Github上建立自己的网站
    小米手机购买程序,如果是我,我会怎么写
  • 原文地址:https://www.cnblogs.com/deroy/p/15459927.html
Copyright © 2011-2022 走看看