Linux shell编程: Linux 环境变量

Posted 万俟淋曦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux shell编程: Linux 环境变量相关的知识,希望对你有一定的参考价值。

接上一篇文章Linux shell编程(二): Linux shell基础

2.3 Linux环境变量

bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许我们在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。这也永久存储数据的一种简便方法。
在bash shell中,环境变量分为两类:全局变量局部变量

2.3.1 全局环境变量和局部环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。

要查看全局变量,可以使用 envprintenv 命令。如果要查看某个环境变量,使用 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
export 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命令,前面有讲到)和私有脚本函数(后面会讲到)的地方。

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脚本编程时并不常用。

以上是关于Linux shell编程: Linux 环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Linux编程 11(shell全局环境变量与局变环境变量)

Linux编程 12 (默认shell环境变量, PATH变量重要讲解)

Linux_10------Linux之shell编程------变量

《Linux命令行与shell脚本编程大全》 第六章环境变量

环境变量—《linux命令行与shell脚本编程大全》

Linux之Shell编程(13)