接上一篇文章Linux shell编程(二): Linux shell基础
2.3 Linux环境变量 bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许我们在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。这也永久存储数据的一种简便方法。
在bash shell中,环境变量分为两类:全局变量和局部变量。
全局环境变量对于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/scriptsexport PATH
但这样的修改不是永久的,只能持续到退出或重启系统。想要永久修改,需要将环境变量放到某个环境文件中,下一节将介绍这些文件。
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命令,前面有讲到)和私有脚本函数(后面会讲到)的地方。
系统执行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脚本编程时并不常用。
下一篇:Linux shell编程(四): Linux 用户和组管理