中华视窗是诚信为本,市场在变,我们的诚信永远不变...
文章目录2.设置用户定义变量3.删除环境变量4.默认的shell环境变量5.设置PATH环境变量6.定位系统环境变量7.数组变量
note:很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。
1.什么是环境变量?
bash shell用一个叫作环境变量( )的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。
这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。
这也是存储持久数据的一种简便方法。
环境变量分为如下两类:
全局环境变量局部环境变量 1.1 全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。
如何查看全局环境变量?
使用env或者命令,甚至是echo,注意使用echo时候,必须在环境变量名前面加上一个美元符号$。
这是因为在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。
note:要显示个别环境变量的值,可以使用命令,但是不要用env命令。
eg:
echo $HISTSIZE
printenv HOME
1.2 局部环境变量
局部变量则只对创建它们的shell可见。
在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。
note:系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
:
命令env、和set之间的差异很细微。set命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序。env和命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env和的输出是重复的。不过env命令有一个没有的功能,这使得它要更有用一些。 2.设置用户定义变量 2.1 设置局部用户变量
1.可以通过等号给环境变量赋值,值可以是数值或字符串。
eg: =Hello
ps:如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
eg: ="Hello World"
note:所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局 部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量 时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
:
变量名、等号和值之间没有空格,这一点非常重要。否则视为单独命令。局部环境变量在子shell中不可见,即不可用。子shell中创建的局部环境变量退出该子shell后失效。父shell中创建的局部环境变量在进入子shell后退出子shell返回父shell,原先创建的局部环境变量仍可用。 2.2 设置全局用户变量
在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。
创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。
该过程使用命令来完成,变量名前不需要加$。
eg:
my_variable="I am Global now"
export my_variable
echo $my_variable
I am Global now
:
修改子shell中全局环境变量并不会影响到父shell中该变量的值。反之,修改父shell中的全局变量则会影响到子shell中该变量的值,子shell甚至无法使用命令改变父shell中全局环境变量的值。 3.删除环境变量
删除环境变量则使用unset命令来实现。记住引用环境变量的时候不要使用$
eg:
unset my_variable
:
如果要用到变量,使用$;如果要操作变量,不使用$。这条规则的一个例外就是使用显示某个变量的值。和修改变量一样,在子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//下面的命令了。
:
对PATH变量的修改只能持续到退出或重启系统。这种效果并不能一直持续。 6.定位系统环境变量
当Linux系统启动一个bash shell的时候,默认情况下bash会在几个文件中查找命令,称之为启动文件或环境文件。
bash检查的启动文件取决于你启动bash shell的方式。
启动bash shell有如下3种方式:
登录时作为默认登录shell作为非登录shell的交互式shell作为运行脚本的非交互shell 6.1 登录时作为默认登录shell
当登录Linux系统时,bash shell会作为登录shell启动。
登录shell会从如下5个不同的启动文件里读取命令:
|启动文件| 描述 | 分类 |
|–|–|–|–|
| /etc/ | /etc/文件是bash shell默认的的主启动文件
只要你登录了Linux系统,bash就会执行/etc/启动文件中的命令。 | 默认的bash shell
主启动文件 |
| $HOME/. | 提供一个用户专属的启动文件来定义该用户所用到的环境变量 | $HOME目录下的
启动文件 |
| $HOME/. | 提供一个用户专属的启动文件来定义该用户所用到的环境变量 | $HOME目录下的
启动文件 |
| $HOME/. | 提供一个用户专属的启动文件来定义该用户所用到的环境变量 | $HOME目录下的
启动文件 |
| $HOME/. | 提供一个用户专属的启动文件来定义该用户所用到的环境变量 | $HOME目录下的
启动文件 |
ps:$HOME表示的是某个用户的主目录。它和波浪号(~)的作用一样。
/etc/文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
6.2 作为非登录shell的交互式shell
当bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),则是交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。
:
.文件有两个作用:一是查看/etc目录下通用的文件,二是为用户提供一个定制自己的命令别名和私有脚本函数(将在第17章中讲到)的地方。如果bash是作为交互式shell启动的,它就不会访问/etc/文件,只会检查用户HOME目录中的.文件。 6.3 作为运行脚本的非交互shell
系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符。
bash shell提供了环境变量。
当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。
如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。
如果变量没有设置,shell脚本到哪里去获得它们的环境变量呢?
有些shell脚本是通过启动一个子shell来执行的。子shell可以继承父shell导出过的变量。
例如:如果父shell是登录shell,在/etc/、/etc/.d/*.sh和$HOME/.文件中
设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。
:
脚本能以不同的方式执行。只有其中的某一些方式能够启动子shell。 6.4 环境变量持久化
Q:如何实现环境变量持久化?
A:在/etc/.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。也可以把自己的alias设置放在$HOME/.启动文件中,使其效果永久化
:
图形化界面组成部分(如GUI客户端)的环境变量可能需要在另外一些配置文件中设置,这和设置bash shell环境变量的地方不一样。尽量不要将新的或修改过的变量设置放在/etc/文件中。虽然它能够将环境变量持久化,但一旦升级了所使用的发行版,这个文件也会更新,那么之前定制过的变量设置就全丢失了。 7.数组变量
环境变量存在一个特性:可以作为数组使用。
数组是能够存储多个值的变量。这些值可以单独引用,也可以作为整个数组来引用。
要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
eg:
mytest=(one two three four five)echo $mytest 错误echo ${mytest[2]} 正确要显示整个数组变量,可用星号作为通配符放在索引值的位置。echo ${mytest[*]}
:
用unset命令删除数组中的某个值。unset [2]环境变量数组的索引值都是从零开始。
申明:文中没特殊注明,图皆来自Linux命令行与shell脚本编程大全。