目录
一.main参数与命令行参数
我们先通过这个小知识帮助理解后面的环境变量~
我们可以发现当我们以空格为分隔符输入的时候,就会打分隔好的数据都存储在argv数组里~
那么bash为什么要这么干呢?我们用一个小demo来进行说明~
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc!=4) { printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n",argv[0]); return 1; } int x = atoi(argv[2]); int y = atoi(argv[3]); if(strcmp("-add",argv[1])==0) { printf("%d+%d=%d\n",x,y,x+y); } else if(strcmp("-sub",argv[1])==0) { printf("%d-%d=%d\n",x,y,x-y); } else if(strcmp("-mul",argv[1])==0) { printf("%d*%d=%d\n",x,y,x*y); else if(strcmp("-div",argv[1])==0) { printf("%d/%d=%d\n",x,y,x/y); } return 0; }
最终是我们可以通过不同的选项让我们的同一个程序去执行其内部不同的功能~
而这么所列举的这些命令行参数,就是Linux指令选项的基础~
二.环境变量
定义变量的本质就是开辟空间,而我们程序在运行的时候也会开辟空间。
在Linux中环境变量不是一个,而是一堆,这些环境变量彼此之间没有关系,它们的作用就是去维护登录用户的周边数据,当操作系统需要去识别你的基本信息的时候就会去找环境变量核对你的信息~
所以环境变量是由系统内置的具有特殊用途的变量~其本质也是开辟空间,然后放入内容~
常见环境变量
PATH : 指定命令的搜索路径
这些是我们系统内置的路径,它的用途是什么呢?是当我们使用该路径上的指令时不用加入绝对路径也不用加入./当前路径就可以执行~
而我们的可执行文件并没有在PATH所划分的路径中,所以需要用./表示当前路径才可以执行~
如果想要让该程序进入到其内置路径我们有两种方法
- 把该程序文件拷贝到其中一个内置路径中(不建议,会造成数据污染)
- 把当前程序的路径添加进PATH中
在添加时是会覆盖原路径的,所以我们需要把原路径也给加上~
不过就算被覆盖了我们重新登录还是会初始化的,所以不用担心~
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
和环境变量相关的命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
我们先设置一个环境变量,再来显示去查看~命令行第三个参数获取环境变量
int main(int argc, char *argv[]) { for(int i = 0;env[i];i++) { printf("------------------env[%d]->%s\n",i,env[i]); } return 0; }
通过main函数参数,我们发现env数组好像是用来存储环境变量的~
环境变量通常具有全局属性,可以被子进程继承下去 我们利用getenv获取环境变量~(常用)
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char * env = getenv("MYENV1"); if(env) { printf("%s\n", env); } return 0; }
一开始执行程序没有打印,说明该环境变量并不存在,当我们export之后再执行程序就出现了~说明子进程也可以继承环境变量~换言之环境变量可以说是全局的存在~
最后介绍一种通过第三方变量environ获取环境变量
#include <stdio.h> int main(int argc, char *argv[]) { extern char **environ; int i = 0; for(; environ[i]; i++){ printf("%s\n", environ[i]); } return 0; }
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
三.本地变量
我们设置一个变量然后也可以查到,为什么用env显示环境变量的时候反而消失了呢?
说明它并不是环境变量,它其实是属于bash该进程的本地变量,只有进程才可以查看它~
我们也可以输入指令set,可以查看环境变量与本地变量~
最后我们再来拿子进程测试一下是否能拿到hello这个本地变量~
int main() { const char *myenv=getenv("hello"); if(myenv==NULL) printf("getenv get null\n"); else printf("myenv=%s\n", myenv); return 0; }
还是拿不到说明子进程确实无法继承本地变量,只能继承环境变量~
ps:(了解即可)最后再来谈谈为什么我们的环境变量最开始是从哪里获取的呢?——从磁盘文件中,在家目录中有一个文件名为.bash—profile的文件,作用是导入环境变量脚本~所以当我们想要修改在内存中的环境变量可以去里面设置~