环境变量
变量
首先明确一下,我们在这里所说的变量是shell变量。
为了便于运算和处理,大部分的编程语言会区分变量的类型,用于分别记录数值、字符或者字符串等等数据类型。Shell 中的变量也基本如此,有不同数据类型(但不用专门指定类型名),以及针对不同数据类型有相应的运算,有不同的作用域。变量的作用域即变量的有效范围(比如一个函数中、一个源文件中或者全局范围),在该范围内只能有一个同名变量。- 如何定义赋值并引用一个变量?
declare tmp #用declare 声明一个变量 tmp=loveyinjuan #给变量tmp赋值 echo $tmp #引用变量tmp
- 如何定义赋值并引用一个变量?
环境变量
- 一些概念:
- 环境变量就是作用域比自定义变量要大,如Shell的环境变量作用于自身和它的子进程。
- 在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。
- Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell中运行的大部分命令都将以 Shell 的子进程的方式运行。
- 三种环境变量
- 当前 Shell 进程私有用户自定义变量
- Shell 本身内建的变量
- 从自定义变量导出的环境变量
与上述三种环境变量相关的命令
command mean set 显示当前 Shell 所有环境变量,包括其内建环境变量,用户自定义变量及导出的环境变量 env 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行 export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量 - set,env,export的包含关系
使用vim中vimdiff工具比较set,env,export的差别
temp=loveyinjuan export temp_env=anranloveyinjuan export|sort > export.txt env|sort > env.txt set|sort > set.txt vimdiff export.txt env.txt set.txt
如何理解以上命令:
- 定义了两个变量。第一个变量temp不是环境变量,所以在export.txt和env.txt,set.txt中都没有;第二个变量为环境变量,所以在三个文件中都有。同时可以看到,set.txt文件中的环境变量数>env.txt中的>export.txt中的。
- 以命令export|sort > export.txt为例子,用到了管道(pipe)和数据流重定向的知识。export|sort表示将export输出的内容排序。> export.txt表示,将输出的内容重定向到文本文件export.txt中,而不是在屏幕上显示。
- set,env,export的包含关系
- 一些概念:
- 命令的查找路径与顺序
- Shell 是怎么知道在哪去找到这个命令然后执行的呢?
答案是通过环境变量PATH来进行搜索的。PATH里面就保存了Shell中执行的命令的搜索路径。通过命令 echo $PATH 可以查看。
- Shell 是怎么知道在哪去找到这个命令然后执行的呢?
添加自定义路径到“PATH”环境变量
PATH中用:分割路径。所以我们可以通过命令PATH=$PATH:/home将/home添加到路径中。但是这个方法再重新打开terminal的时候就失效了,也就是说,每打开一次terminal就要先执行一次上述命令才行。那有什么方法可以一劳永逸吗?
我们知道,打开terminal时会自动运行shell程序,shell程序打开时会加载配置文件。这个配置文件名为.bashrc(在bash shell中是如此)。通过修改.bashrc便可达到目的。执行命令echo “PATH=$PATH:/home” >> .zshrc便可将目录/home添加到路径中。
修改和删除已有变量
变量修改
变量设置方式 说明 ${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据 ${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据 ${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据 ${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据 ${变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串 ${变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串 变量删除
unset命令
如何让环境变量立即生效 –> source命令或 . 命令
在修改过.bashrc文件后,可能不能立即生效。那么我们应该执行什么命令呢?
当然是source和 .source .bashrc #或者执行一下命令也可以达到更新shell配置的目的 . ./.bashrc #必须要有完整的绝对或者相对路径
文件查找
- whereis
- 没有从硬盘中依次查找,而是直接从数据库中查询。
- whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用locate命令。
- locate
- 通过”/var/lib/mlocate/mlocate.db”数据库查找,经常使用的一个命令。
- 系统会每天自动执行updatedb命令更新一次,所以有时候刚添加的文件,可能会找不到,需要手动执行一次updatedb命令
- which
- Shell 内建的一个命令,常用来判断是否安装某软件
- 只从PATH环境变量指定的路径中去搜索命令
- find
- 功能强大,复杂
- whereis
补充问题:
环境变量和非环境变量;全局变量和局部变量的区别?
- 环境变量的判断标准是:是否在子进程中有效。
- 有些人也将所有变量统称为环境变量,只是以全局环境变量和局部环境变量进行区分。
数据流重定向
>>表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的>是以覆盖的方式重定向到一个文件中,使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。