【命令行参数】与【环境变量】

一、前言

相信大家在C语言学习过程中,一定看到过这样的main函数:

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

        大多数只有前两个参数,少部分有三个参数,但是大家基本是没有用到过它们,也基本也没有验证过它们是什么,看到这里的大家呢,我建议你们学习完操作系统、命令行操作之后再来探究,学C语言不涉及main函数的参数,可以暂时不看。

二、命令行参数内容与验证

main函数的参数 叫做【命令行参数】

int main(int argc, char *argv[], char *env[])
  1. argc :命令行中的参数个数,参数以空格分割;
  2. argv:指针数组,存的是命令行参数中每个参数的首元素地址,以NULL结尾
  3. env:指针数组,存的是每个环境变量的首元素地址,以NULL结尾

现在来验证一下这几个参数到底是什么吧!

1. 【argc】和【argv】

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

        这里就是会发现参数argc是我们命令行中输入的字符串个数,而argv这个字符指针数组是存的是由空格分开的这些字符串的首元素地址

如果我们不加上argc的限制呢?

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

        我们会发现依旧是输出命令行这些字符,所以我们会发现这个字符指针数组是由NULL结束的。看到这里就和命令行中的指令很相似了,没错,在命令行中的指令就是通过main参数——命令行参数组成的。这样我们也就可以自己创造指令了。通过后面跟的选项不同,来实现不同的功能。

2. env

代表的是环境变量,也是以NULL结尾

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

三、环境变量

        首先理解一下变量,在我们写编程语言的代码时,会定义很多变量,定义变量的本质就是开辟一段空间,之后给这段空间起名字,写内容。所以今天要学习的环境变量也是一个道理,也是在内存里开辟一段空间,拥有自己的名字与内容。

        环境变量:是多个变量,只不过是统称为环境变量。就像我们每个人都有自己的名字,但是我们统称为人。环境变量之间没有任何关系,是操作系统内置的,具有特殊用途的变量。

3.1 查看环境变量的方法:

1. 查看指定的环境变量

echo $name //name -> 环境变量名

2. 查看所有环境变量

env

3.2 新建和删除一个环境变量

export 环境变量名=值
unset name

3.3 在进程中获取环境变量

1. 命令行参数获取

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

2. 函数调用获取指定环境变量(常用)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("%s\n", getenv("PATH"));
    return 0;
}

3. 第三方变量获取

#include <stdio.h>
#include <stdlib.h>
int main()
{
    extern char **environ;
    for(int i = 0; environ[i]; ++i)
    {
        printf("environ[%d] : %s\n", i, environ[i]);
    }
    return 0;
}

3.4 测试环境变量PATH

PATH:指定命令的搜索路径

        根据上面命令行参数的学习,知道了指令和指令不同的选项就是由命令行参数构成的,所以指令的本质就是一个可执行程序,那运行一个可执行程序需要带其所在的路径。而指令是不需要带其所在的路径的,这是因为我们在输入指令的时候,会自动去其环境变量PATH中去寻找,找到了就直接运行,找不到就会显示没有找到。

1. 将可执行程序变为指令

添加PATH的搜索路径:

PATH=$PATH:程序所在路径

将可执行程序放在PATH中任意一个路径中(但是由于我们写的指令不够成熟,可能会污染命令池,所以不推荐)

3.5 谈环境变量

        环境变量,其实是一个全局变量,因为我们每一个程序都有环境变量,都可以打印出来,这是因为环境变量可以被子进程继承,而所有在命令行运行的程序都是bash的子进程,那环境变量就会被这些进程继承。经过上面对PATH的理解,我们知道指令是通过从PATH里面的搜索路径中寻找,找到才可以运行。

        那操作系统又是怎么知道你所在的路径呢?是因为有一个环境变量PWD来提供的;

        操作系统知道用户是谁,是根据环境变量 USER;

        我们登陆时默认进入家目录,根据环境变量 HOME。

        所以环境变量是给操作系统提供用户的相关信息的。但是我们现在知道的这些环境变量是内存级别的,也就是我们每一次登陆,都会重新初始化环境变量,既上次登陆对环境变量的修改不会在第二次登陆生效。

        那每次登陆的时候,是谁给bash环境变量的?

        肯定是在磁盘中的一个文件(家目录下的.bash_profile),每一次登陆的时候,这个文件的内容就会给bash。

3.6 环境变量的意义

        浅谈一下环境变量的意义之一,可以根据getenv的USER来识别用户身份,以此看其是否具备运行某代码的权限;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    if(strcmp("wyd", getenv("USER")) == 0)
    {
        printf("I am wyd , you can do ...\n");
        //wyd代码
    }
    if(strcmp("root", getenv("USER")) == 0)
    {
        printf("I am root , you can do ...\n");
        //root代码
    }
    return 0;
}

四、本地变量

        不是环境变量,不可以被子进程继承,不具有全局属性,只在bash内部有效。

        定义一个本地变量,直接name=val就行;

        查看变量用set,set可以把本地变量和环境变量都显示出来;

        删除变量:unset name

猜你喜欢

转载自blog.csdn.net/2302_76941579/article/details/135158213