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

一、前言

相信大家在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

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要追随光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值