【读书笔记】Linux命令行与Shell脚本编程大全--使用Linux环境变量

note:很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。

1.什么是环境变量?

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

  1. 全局环境变量
  2. 局部环境变量

1.1 全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。

如何查看全局环境变量?
使用env或者printenv命令,甚至是echo,注意使用echo时候,必须在环境变量名前面加上一个美元符号$
这是因为在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。
note:要显示个别环境变量的值,可以使用printenv命令,但是不要用env命令。
eg:

echo $HISTSIZE
printenv HOME

1.2 局部环境变量

局部变量则只对创建它们的shell可见。
在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量

note:系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。

notice:

  1. 命令env、printenv和set之间的差异很细微
  2. set命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序
  3. env和printenv命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env和printenv的输出是重复的
  4. 不过env命令有一个printenv没有的功能,这使得它要更有用一些。

2.设置用户定义变量

2.1 设置局部用户变量

1.可以通过等号给环境变量赋值,值可以是数值或字符串。
eg:my_variable=Hello

ps:如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
eg:my_variable="Hello World"

note:所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局 部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量 时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。

notice:

  1. 变量名、等号和值之间没有空格,这一点非常重要。否则视为单独命令。
  2. 局部环境变量在子shell中不可见,即不可用。
  3. 子shell中创建的局部环境变量退出该子shell后失效。父shell中创建的局部环境变量在进入子shell后退出子shell返回父shell,原先创建的局部环境变量仍可用。

2.2 设置全局用户变量

在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。
创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。
该过程使用export命令来完成,变量名前不需要加$
eg:

my_variable="I am Global now"
export my_variable
echo $my_variable
I am Global now

notice:

  1. 修改子shell中全局环境变量并不会影响到父shell中该变量的值。反之,修改父shell中的全局变量则会影响到子shell中该变量的值,子shell甚至无法使用export命令改变父shell中全局环境变量的值。

3.删除环境变量

删除环境变量则使用unset命令来实现。记住引用环境变量的时候不要使用$
eg:

unset my_variable

notice

  1. 如果要用到变量,使用$;如果要操作变量,不使用$。这条规则的一个例外就是使用printenv显示某个变量的值。
  2. 和修改变量一样,在子shell中删除全局变量后,无法将效果反映到父shell中。

4.默认的shell环境变量

默认情况下,bash shell会用一些特定的环境变量来定义系统环境。
具体有哪些环境变量,可参照该书的第6.4章节或自行查询资料。

5.设置PATH环境变量

何为PATH环境变量
当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。
PATH环境变量定义了用于进行命令和程序查找的目录。
在这里插入图片描述
如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。

Q:如何解决应用程序放置可执行文件的目录常常不在PATH环境变量所包含的目录中的问题?
A:保证PATH环境变量包含了所有存放应用程序的目录,可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义。PATH中各个目录之间是用冒号分隔的。你只需引用原来的PATH值,然后再给这个字符串添加新目录就行了。
eg:

$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: 
/sbin:/bin:/usr/games:/usr/local/games 
$ 
$ PATH=$PATH:/home/christine/Scripts 
$ 
$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/ 
 games:/usr/local/games:/home/christine/Scripts

这样就可以使用/home/christine/Scripts下面的命令了。

notice:

  1. 对PATH变量的修改只能持续到退出或重启系统。这种效果并不能一直持续。

6.定位系统环境变量

当Linux系统启动一个bash shell的时候,默认情况下bash会在几个文件中查找命令,称之为启动文件环境文件
bash检查的启动文件取决于你启动bash shell的方式。
启动bash shell有如下3种方式:

  1. 登录时作为默认登录shell
  2. 作为非登录shell的交互式shell
  3. 作为运行脚本的非交互shell

6.1 登录时作为默认登录shell

当登录Linux系统时,bash shell会作为登录shell启动。
登录shell会从如下5个不同的启动文件里读取命令:

启动文件 描述 分类
/etc/profile /etc/profile文件是bash shell默认的的主启动文件
只要你登录了Linux系统,bash就会执行/etc/profile启动文件中的命令。
默认的bash shell
主启动文件
$HOME/.bash_profile 提供一个用户专属的启动文件来定义该用户所用到的环境变量 $HOME目录下的
启动文件
$HOME/.bashrc 提供一个用户专属的启动文件来定义该用户所用到的环境变量 $HOME目录下的
启动文件
$HOME/.bash_login 提供一个用户专属的启动文件来定义该用户所用到的环境变量 $HOME目录下的
启动文件
$HOME/.profile 提供一个用户专属的启动文件来定义该用户所用到的环境变量 $HOME目录下的
启动文件

ps:$HOME表示的是某个用户的主目录。它和波浪号(~)的作用一样。

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。

6.2 作为非登录shell的交互式shell

当bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),则是交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。

notice:

  1. .bashrc文件有两个作用:一是查看/etc目录下通用的bashrc文件,二是为用户提供一个定制自己的命令别名和私有脚本函数(将在第17章中讲到)的地方。
  2. 如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

6.3 作为运行脚本的非交互shell

系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符。

bash shell提供了BASH_ENV环境变量。
当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。
如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。

如果BASH_ENV变量没有设置,shell脚本到哪里去获得它们的环境变量呢
有些shell脚本是通过启动一个子shell来执行的。子shell可以继承父shell导出过的变量。
例如:如果父shell是登录shell,在/etc/profile、/etc/profile.d/*.sh和$HOME/.bashrc文件中
设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。

notice:

  1. 脚本能以不同的方式执行。只有其中的某一些方式能够启动子shell。

6.4 环境变量持久化

Q:如何实现环境变量持久化?
A:在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。也可以把自己的alias设置放在$HOME/.bashrc启动文件中,使其效果永久化

notice:

  1. 图形化界面组成部分(如GUI客户端)的环境变量可能需要在另外一些配置文件中设置,这和设置bash shell环境变量的地方不一样。
  2. 尽量不要将新的或修改过的变量设置放在/etc/profile文件中。虽然它能够将环境变量持久化,但一旦升级了所使用的发行版,这个文件也会更新,那么之前定制过的变量设置就全丢失了。

7.数组变量

环境变量存在一个特性:可以作为数组使用
数组是能够存储多个值的变量。这些值可以单独引用,也可以作为整个数组来引用。
要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
eg:

 mytest=(one two three four five)
 echo $mytest   错误
 echo ${mytest[2]}  正确

 要显示整个数组变量,可用星号作为通配符放在索引值的位置。
 echo ${mytest[*]}

notice:

  1. 用unset命令删除数组中的某个值。unset mytest[2]
  2. 环境变量数组的索引值都是从零开始。

申明:文中没特殊注明,图皆来自Linux命令行与shell脚本编程大全<第三版>。

发布了91 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_23327993/article/details/104556008