环境变量(environment variable)是其值在程序外部设置的变量,通常通过操作系统或微服务内置的功能设置。 环境变量由名称/值对组成(VARIABLE_NAME=value),可以在任何时间点进行引用。
bash shell用环境变量的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松快速访问到它们。这也是存储持久数据的一种简便方法。
系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
在bash shell中,环境变量分为两类:
全局变量:全局环境变量对于shell会话和所有生成的子shell都是可见的。
查看全局变量,可以使用env或printenv命令。
要显示个别全局环境变量的值,可以直接使用printenv命令,或者用env命令+grep检索。
也可以使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面加上一个美元符($)
在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。
全局环境变量可用于进程的所有子shell。
用bash命令生成一个子shell后,echo $HOME 显示环境变量的当前值,这个值和父shell中的一模一样。
局部变量:局部变量则只对创建它们的shell可见。
局部环境变量只能在定义它们的进程中可见。
Linux系统并没有一个只显示局部环境变量的命令。
set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。 set还会按照字母顺序对结果进行排序。
用户自己定义局部变量
可以通过等号(=)给环境变量赋值,值可以是数值或字符串。
变量名区分大小写。所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。能够避免重新定义系统环境变量可能带来的灾难。
1.变量名、等号和值之间没有空格。
2.如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
3.只能在当前shell中使用局部环境变量。
来做两个练习:
1. 在父shell中设置局部变量,进入子shell中查看
2. 在子shell中设置局部变量,退出子shell后在父shell中查看
用户自己定义全局环境变量
方法:先创建一个局部环境变量,再通过export命令把它导出到全局环境中。
修改子shell中环境变量并不会影响到父shell中该变量的值。
命令unset+变量名可删除已经存在的环境变量。
在unset命令中引用环境变量时,记住不要使用$。
(如果要用到变量,使用$;如果要操作变量,不使用$。但用printenv显示某个变量的值是个例外,printenv HOME)
用以上这种方式用户自己进行定义的环境变量,下次重新启动Linux就被删除了。如果想不被删除,一直存在,我们该怎么办?
我们需要在系统自启动文件~/.bashrc中进行配置,将export命令写入到该文件内,这样我们下次重启系统后,这个变量就不会丢失了。因为每次启动系统都会执行.bashrc中的所有命令行。
以下是具体操作:
vim ~/.bashrc
export my_variable='Hello World’
source ~/.bashrc
当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的应用程序。PATH环境变量定义了用于进行命令和程序查找的目录。
PATH中的目录使用冒号(:)分隔。
如果我们自己在某个目录下安装了一个应用程序,那我们该如何调用这个应用程序呢?
可以在命令行输入目录+应用程序的可执行文件名进行调用,如:/usr/bin/bash
但是这样很麻烦,还要记住应用程序所在的目录,我们可不可以直接输入程序名就完成调用呢?
像我们的bash程序就是直接输入bash调用的。这是因为上一页echo $PATH显示,/usr/bin/这一目录已经被写入到环境变量里了,所以我们可以直接使用bash命令
从apt下载的应用程序,默认都是直接放在系统PATH环境变量路径下的,所以都可以直接调用
我们自己下载的应用程序,该如何直接输入就进行调用呢?
可以把应用程序的目录添加到现有的PATH环境变量中:
export PATH=$PATH:/home/zhang/zz/XXX
意思就是在原来的PATH值基础上,再追加一个新的目录到PATH环境变量中。
将目录加到PATH环境变量之后,你现在就可以在虚拟目录结构中的任何位置执行程序XXX。
但是退出或重启Linux系统,则对PATH变量修改会被删除。
如果想要始终存在于PATH变量中,类似之前的操作,添加到~/.bashrc文件中:
在你登入Linux系统启动一个bash shell时,默认情况下bash会在启动文件(或环境文件)中查找命令。
当你登录Linux系统时,bash shell会作为登录shell启动。
登录shell会从5个不同的启动文件里读取命令:
/etc/profile
$HOME/.profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.bash_profile
$HOME目录下的启动文件
提供一个用户专属的启动文件来定义该用户所用到的环境变量。
/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这
个启动文件
用户的四个启动文件:(这四个文件都以点号(.)开头,这说明它们是隐藏文件)
$HOME/.profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.bash_profile
数组是能够存储多个值的变量。Bash Shell 只支持一维数组(不支持多维数组)。环境变量可作为数组使用。这些值可以单独引用,也可以作为整个数组来引用。
Shell 数组用括号()来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value_1 value_2 ... value_n)
要引用、读取数组中某个元素的值,必须用它在数组中位置的数值索引值,如下:
${array_name[index]}
索引值(index)要用方括号([])括起来 (与大部分编程语言类似,数组元素的下标由 0 开始)。要显示整个数组变量,可用星号(*)作为通配符放在索引值的位置。
用等号(=)可以改变数组中某个索引值位置的值
unset命令删除数组中的某个值或整个数组。但是unset删除索引上的值但是保留索引位置