Linux环境变量
- 1.环境变量分类
- 2.环境变量相关指令
- 3.常用的环境变量
- 4.环境变量的组织方式
- 5.获取环境变量
- 6.命令行参数
1.环境变量分类
-
按生命周期划分:
- 永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
- 临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
-
按作用域划分:
- 系统环境变量:公共的,对全部的用户都生效。
- 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。
2.环境变量相关指令
env:查看当前用户全部的环境变量
env | grep 环境变量名:筛选包含的环境变量
exprot :显示当前系统定义的所有的环境变量
printenv 环境变量名:查看指定环境变量的值
echo $环境变量名:查看指定环境变量的值
unset 环境变量名:清除指定环境变量
3.常用的环境变量
PATH
功能和作用
可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。
书写格式
PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。
export PATH=目录1:目录2:目录3:…目录n:.
PATH缺省包含Linux系统命令所在目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。
通过图可以看到,当PATH里没有了系统默认目录时,ls命令就不可直接使用了,必须要使用绝对路径才能使用,如下图:
想在PATH环境变量中增加其他的路径的方法:
export PATH = PATH:/其他的路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
普通用户和root用户的区别
SHELL : 当前Shell,它的值通常是/bin/bash
4.环境变量的组织方式
每个程序都有一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
5.获取环境变量
main 函数的形参列表最多可以带有 3 个参数,分别为 argc 、 argv 、 envp :
int main(int argc,char* argv[],char* envp[]){}
其中 char* envp[] 是一个指针数组,该数组里面的指针都分别指向不同的字符串,并且最后一个指向有效字符串的指针的下一个指针一定指向 “NULL”,如下图:
下面编译一段代码:
#include<stdio.h>
#include<unistd.h>
int main(int argc,char*argv[],char*envp[])
{for(int i=0;envp[i];++i){printf("envp[%d]->%s\n",i,envp[i]);}return 0;
}
结果:
发现这些指针指向的就是一个一个环境变量字符串。
讲到这里,我们的C/C++素养让我们意识到当函数传参数组时,传递的不是数组本身,而是数组首元素地址,所以在 main 函数的形参列表中写成的 char* envp[] 形式,本质上是一个二级指针,名为 environ ,查看一下 man 手册:
man environ
以后想要获取环境变量就可以通过遍历这个表状结构体获取了。
但是这样做的话太过于麻烦,为了方便起见,主流的获取环境变量的方法是通过函数获取,该函数名为 getenv 。
使用 man 手册查看该函数:
man getenv
用法就是:
getenv(环境变量名)
如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char*argv[],char*envp[])
{char*pwd=getenv("PWD");if(pwd==NULL)perror("getenv error");else printf("%s\n",pwd);return 0;
}
和预期结果一样。
补充:环境变量具有全局属性,可以被子进程继承。
通过上图我们可以发现,当使用export创建环境变量时,env指令可以查看到这个变量,而当直接创建环境变量时,env却不能查看到,只能用echo $环境变量名 查看,通过上面的现象可以发现,使用export 创建的环境变量被导入了环境表中,该变量称为全局环境变量。而直接创建没有被导入环境表,该变量称为本地环境变量
本地变量不能被子进程继承,在环境表中的全局环境变量可以被继承
为什么echo可以查看到本地变量?
echo属于内键命令,内建命令后面叫。
6.命令行参数
认识了main函数中的一个参数。其它两个也就非常容易理解了。
现在思考一个问题:为什么ls可以使用-a -l这些选项呢?
现在我们写一个程序测试一下我们能否也使用命令行参数吧
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char* argv[],char*envp[])
{for(int i=0;i<argc;++i){printf("argc:%d,argv[%d]=%s\n",argc,i,argv[i]);}return 0;
}
命令行参数的应用:
设计一个计算器
#include<stdio.h>
#include<string.h>
#include<stdlib.h>void Usage(const char* name)
{printf("\nUsage:%s -[+][-][*][/]\n\n",name);exit(-1);
}
int main(int argc,char* argv[],char* envp[])
{if(argc!=2) // 必须指定输入一个参数Usage(argv[0]);int n1 = 0;int n2 = 0;int ret = 0;printf("-----num1 = ");scanf("%d",&n1);printf("-----num2 = ");scanf("%d",&n2);if(strcmp(argv[1],"-+")==0) ret = n1 + n2;else if(strcmp(argv[1],"--")==0) ret = n1 - n2;else if(strcmp(argv[1],"-*")==0) ret = n1 * n2;else if(strcmp(argv[1],"-/")==0) ret = n1 / n2;printf("\n-----resault = %d\n",ret);return 0;
}
结果:
LInux环境变量的分享就到这了,如有错误还望支持,886!!!