欢迎各位大佬光临本文章!!!
还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。
本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬、帅哥、美女点点支持,您的每一分关心都是我坚持的动力。
我的博客地址:bingbing~bang的博客_CSDN博客
https://blog.csdn.net/bingbing_bang?type=blog
我的gitee:冰冰棒 (bingbingsupercool) - Gitee.com
https://gitee.com/bingbingsurercool
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,例如,我们使用C++,C语言来编写代码时,我们从来不知道编译时链接的动静态库在哪里,但是依旧可以链接成功,这就得益于环境变量的配置。
常见的环境变量有PATH,HOME,SHELL等,每个环境变量都有自己独特的用处。
(1)PATH
PATH环境变量的作用为指定命令的搜索路径。当我们使用系统命令的时候,可以直接输入命令即可,例如ls,pwd等命令。但是当我们自己写的可执行程序就需要带路径,不带路径是不能执行的。

那么为什么系统命令不需要呢?原因在于环境变量的配置。PATH记录的就是系统在执行命令时去寻找的路径,我们使用的系统命令都放在这些路径中,由于我们自己书写的可执行程序的路径并没有配置到环境变量中,因此必须在执行的时候添加程序的路径,来指定。
我们可以使用echo命令查看环境变量:echo $name,查看环境变量name。

那么如果我们将自己的程序路径配置到系统环境变量的路径中是不是就可以直接执行,而不需要指定路径了呢?答案是肯定的,确实可以。
我们可以使用export PATH=$PATH : 文件目录命令将路径添加到环境变量PATH中。

我们不用担心自己的设置了环境变量会不会污染系统本身,因为我们自己设置的只在本次登录中有效。
(2)HOME
HOME环境变量为指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。我们登陆不同的用户,系统会根据环境变量来登录不同的工作目录。

因此我们使用命令cd ~回到主工作目录的时候依赖的就是HOME环境变量。
(3)SHELL
当前Shell,通常是/bin/bash

echo :显示某个环境变量
export :设置某个环境变量
env :显示所有环境变量
unset :清除环境变量
set :显示本地定义的shell变量和环境变量
使用env显示所有环境变量:

环境变量的组织方式实际上就是一个指针数组,每个指针指向一个以 '\0' 结尾的环境字符串

我们查看环境变量的方式不仅可以使用命令实现,我们也可以在代码程序中获得。
(1)main函数的第三个参数
main函数中具有三个参数,前两个为命令行参数,第三个为环境变量。因此我们可以在程序中执行下列代码来获取环境变量。而命令行参数存在的意义在于我们可以使用不同的选项来执行一个从程序的不同逻辑(代码在最后附上)。

- #include
- int main(int argc, char *argv[], char *env[])
- {
- int i = 0;
- printf("begin--------------------\n");
- for(; env[i]; i++)
- {
- printf("%s\n", env[i]);
- }
- printf("end-----------------------\n");
- return 0;
- }

与我们使用env命令获得没有什么差异。
(2)第三方变量environ
第三方变量environ是libc中定义的全局变量,指向环境表,它并不包含在任意的头文件中,使用的时候需要用extern声明。
- #include
- int main(int argc, char *argv[])
- {
- extern char **environ;
- int i = 0;
- for(; environ[i]; i++){
- printf("%s\n", environ[i]);
- }
- return 0;
- }
(3)getenv函数
该函数也能获得某个环境变量,包含头文件
- #include
- #include
- int main()
- {
- printf("%s\n", getenv("PATH"));
- return 0;
- }

环境变量具备全局属性,可以被子进程继承下去。我们可以用下列代码进行测试。
- #include
- #include
- int main()
- {
- char * env = getenv("MYENV");
- if(env){
- printf("%s\n", env);
- }
- return 0;
- }
直接运行,我们会发现运行失败,因为系统中没有环境变量MYENV。
我们可以在命令行中导入环境变量:export MYENV="hello world"
当我们再次执行代码后(不用重新编译),发现运行成功了。

这就说明shell创建的子进程继承了环境变量,环境变量是全局的。 我们直接设置不加export的变量为局部变量。
附:命令行参数测试代码
- int main((int argc, char *argv[])
- {
- if(argc!=2)
- {
- printf("至少要有一个选项\n");
- }
- if(strcmp("-a",argv[1])==0)
- {
- printf("选项a\n");
- }
- else if(strcmp("-b",argv[1])==0)
- {
- printf("选项b\n");
- }
- return 0;
- }