接上一篇文章Linux shell编程(二): Linux shell基础
2.3 Linux环境变量
bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许我们在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。这也永久存储数据的一种简便方法。
在bash shell中,环境变量分为两类:全局变量和局部变量。
2.3.1 全局环境变量和局部环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
要查看全局变量,可以使用
env
或
printenv
命令。如果要查看某个环境变量,使用
printenv
如下:
也可以使用
echo $HOME
打印某个环境变量的值,其中
$HOME
表示用
HOME
的值替换此处。
局部环境变量只能在定义它们的进程中可见。
Linux没有只查看局部环境变量的命令,使用
set
命令可以打印全局变量、局部变量以及用户定义变量,还会按照字母顺序对结果进行排序。
2.3.2 自定义环境变量
除了系统环境变量,用户还可以自定义环境变量。一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串(注意等号两端不许有空格,否则shell会将变量名误认为是一条命令,因为shell语句的命令与参数是用空格分割的)。
如果变量值里自带空格,需要将变量值用引号包含起来,如下:
另外,由于系统环境变量默认使用大小字母,为避免覆盖已有的系统环境变量,自定义环境变量要使用小写字母。
以上自定义环境变量均是局部环境变量,要想自定义全局环境变量,需要在创建局部环境变量后使用
export
命令将其导出到全局环境中。如下:
首先,创建了一个局部环境变量
a=8
,然后创建一个子shell,在子shell中是没有
a
这个环境变量的,然后使用
exit
回到父shell,是可以打印
a
环境变量的,使用
export
将局部环境变量到出到全局环境中,然后再创建一个子shell,此时子shell中是可以打印变量
a
的,应为此时
a
已经是全局环境变量了。
这里注意,子shell对全局环境变量的操作(包括创建、修改与删除)是影响不到父shell的。
2.3.3 删除环境变量
删除环境变量使用
unset
命令,如下:
2.3.4 系统环境变量
linux预设了一些系统环境变量供操作系统和用户使用,不同Linux发行版预设的系统环境变量不同。
PATH 环境变量
有没有想过,当我们输入外部shell命令时,系统是怎样找到执行文件的,就是通过PATH环境变量。
PATH 环境变量定义了用于进行命令和程序查找的目录。
如果命令或者程序的位置没有包括在 PATH 变量中,执行该命令或程序时,如果不使用绝对路径, shell是没法找到的,会报
command not found
的错误。
PATH环境变量格式如下:
每个目录用冒号分隔,如果需要添加新的路径,可以使用如下语法(/home/vistar/Scripts是添加的新目录):
PATH=$PATH:/home/vistar/Scripts
exportPATH
但这样的修改不是永久的,只能持续到退出或重启系统。想要永久修改,需要将环境变量放到某个环境文件中,下一节将介绍这些文件。
2.3.5 定位系统环境变量
当登录Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件或环境文件。bash检查哪个启动文件取决于启动bash shell的方式。
启动bash shell有3种方式:
- 登录时作为默认登录shell
- 作为非登录shell的交互式shell
- 作为运行脚本的非交互shell
a. 登录时作为默认登录shell
当登录Linux系统时,bash shell会作为登录shell启动。
登录shell会从5个不同的启动文件里读取命令:
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
/etc/profile
/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。其余文件是针对用户的,它们提供一个用户专属的启动文件来定义该用户所用到的环境变量,可根据需要修改。
不同Linux发行版的/etc/profile文件内容不同,我用的Ubuntu 20.04,内容如下:
需要注意的是,其中的
/etc/bash.bashrc
文件存储了系统环境变量;
/etc/profile.d
目录相当于windows的开机启动目录,当Linux开始时,shell会执行该目录下的所有可执行文件。
$HOME目录下的启动文件
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
执行启动文件时,按照下列顺序,找到一个则会忽略其余的文件。其中$HOME/.bashrc文件通常会通过下列文件间接执行。
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
注意,不是每个文件都会用到,不同的Linux发行版用到的文件不同。比如我用的Ubuntu 20.04中,默认只有$HOME/.profile文件,如果需要用到其余文件,可以自定义添加。$HOME/.profile文件内容如下:
这个文件干了两件事,首先执行了$HOME/.bashrc文件,然后将路径 $HOME/bin 和 $HOME/.local/bin 添加到了PATH环境变量中。
b. 交互式 shell 进程
如果bash shell不是登录系统时启动的,那么该shell叫作交互式shell。
如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录
中的.bashrc文件。
.bashrc文件有两个作用:一是查看/etc目录下通用的bashrc文件,二是为用户提供一个定制自
己的命令别名(alias命令,前面有讲到)和私有脚本函数(后面会讲到)的地方。
c. 非交互式 shell
系统执行shell脚本时用的是非交互式 shell,它没有命令提示符。
2.3.6 数组变量
环境变量可作为数组使用,数组是能够存储多个值的变量。这些值可以单独引用,也可以作为整个数组来引用。
要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔,如下:
mytest=(one two three four five)
- 显示数组的某一元素: 使用索引值
echo${mytest[0]}
- 显示整个数组:使用星号作为通配符放在索引值的位置
echo${mytest[*]}
- 修改元素值:索引后赋值
mytest[0]=1
- 删除某个元素:unset命令+索引
unset mytest[0]
注意这里有点不一样,删除了索引值为0的元素,但后面元素的索引值不会变,也就是说数组里没有索引值为0的元素了,此时数组4个元素的索引值分别为[1 2 3 4],假如删除的为索引值3的元素,则删除后数组各元素的索引值分别为[0 1 2 4],如下:
可以看到,删除索引值为0的元素后,打印索引值为0的元素时为空。
- 删除整个数组:unset整个数组
unset mytest
由于数组变量不是很灵活,所以在shell脚本编程时并不常用。
版权归原作者 万俟淋曦 所有, 如有侵权,请联系我们删除。