Linux学习笔记(六)

第六章 使用Linux环境变量

1.什么是环境变量

bash shell用一个叫做环境变量(environment)的特性来存储有关shell会话和工作环境的信息。环境变量允许你在内存那种存储数据,以便程序或shell中运行的脚本能够轻松访问他们。bash shell中环境变量分为两类:全局变量,局部变量。

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

局部环境变量:只对创建他们的shell可见。

Linux系统在开始bash时就设置了一些全局环境变量,系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。查看全局环境变量,可以使用envprintenv命令。

$ printenv
HOSTNAME=server01.class.edu
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash

要显示个别环境变量的值,可以使用printenv命令,但是不要使用env命令。

$ printenv HOME
/home/Christine
$
$ env HOME
env: HOME: No such file or directory

也可以使用echo命令显示变量的值。在此情况下引用某个环境变量的值,必须在变量前面加上一个美元符号($)。

$ echo $HOME
/home/Christine

echo命令中,在变量名前面加上$可不仅仅是要显示变量当前的值,也能够让变量作为命令行参数。

$ ls $HOME
Desktop Downloads Music Public test.sh
Documents junk.dat Pictures Templates Videos
$
$ ls /home/Christine
Desktop Downloads Music Public test.sh
Documents junk.dat Pictures Templates Videos

局部环境变量:局部环境变量就是只能在创建他们的进程中可见。Linux系统也默认定义了标准的局部环境变量。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量,全局变量以及用户自定义变量。

2.设置用户自定义变量

启动了bash shell就可以在shell进程内创建局部变量,可以通过=等号给环境变量赋值,值可以是数值或字符串。

$ echo $my_variable

$ my_variable=Hello
$
$ echo $my_variable
Hello

如果要给变量赋一个含有空格的字符串值,必须使用但引号来界定字符串的首和尾。

$ my_variable=Hello World
-bash: World: command not found
$
$ my_variable="Hello World"
$
$ echo $my_variable
Hello World

没有单引号的话,bash shell会以为下一个单词是另一个要执行的命令。用户定义的环境变量都是小写字幕,系统环境变量都是大写字母。

变量名,等号和值之间没有空格。

$ my_variable = "Hello World"
-bash: my_variable: command not found

设置全局环境变量的方法是先创建一个局部环境部变量,然后再把它导入到全局环境中,使用export命令,变量名前不需要加$

$ my_variable="I am Global now"
$
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ exit
exit
$
$ echo $my_variabl

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

$ my_variable="I am Global now"
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ my_variable="Null"
$
$ echo $my_variable
Null
$
$ exit
exit
$
$ echo $my_variable
I am Global now
3.删除环境变量

使用unset命令删除环境变量。在使用unset命令中引用环境变量时,不要使用$符号。

$ echo $my_variable
I am Global now
$
$ unset my_variable
$
$ echo $my_variable
$

如果用到环境变量,要使用$;如果要操作环境变量,不要使用$。此规则唯一一个例外就是使用printenv命令显示某个变量的值。

如果在子进程中删除了一个全局变量,只对子进程有效。该全局环境变量在父进程中依然可用。和修改变量一样,在子shell中删除全局变量后,无法将结果反映到父shell中。

4.默认的shell环境变量

bash shell源自当初的Unix Bourne shell,因此也保留了Unix Bourne shell里定义的那些环境变量。如下列出几个常用的默认bash shell环境变量:

HOME:当前用户的主目录。

PATH:shell查找命令的目录列表,由冒号分隔。

BASH:当前shell事例的全路径名。

5.设置PATH环境变量

**当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。**PATH环境变量定义了用于进行命令和程序查找的目录。PATH环境变量的内容如下:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games

PATH中的目录使用:分隔。**如果命令或程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。**应用程序放置可执行文件的目录常常不在PATH环境变量所包含的目录中,解决办法是保证PATH环境变量包含了所有存放应用程序的目录。可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义,只需引用原来的PATH值,然后再给这个字符串添加到新目录就可以了。

$ 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

将目录加到PATH环境变量后,就可以在虚拟目录结构中的任何位置执行程序。将单点字符也加入到PATH环境变量,单点字符.表示当前目录。对PATH变量的修改只能持续到退出或重启系统。

6.定位系统环境变量

当你登录Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件环境文件。bash检查的启动文件取决于你启动bash shell的方式,bash shell有三种方式:登录时作为默认登录shell,作为非登录shell的交互shell,作为运行脚本的非交互shell。

登录shell:当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:/etc/profile$HOME/.bash_profile$HOME/.bashrc$HOME/.bash_login$HOME/.profile

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

$HOME目录下的启动文件:提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用到四个启动文件中的一个到两个。$HOME表示的是某个用户的主目录,他和波浪号~的作用一样。

交互式shell进程:如果bash shell不是在登录时系统启动的话,那么此bash shell叫做交互式shell。交互式shell不会向登录shell一样运行,但是它依然提供了命令行提示符来输入命令。如果bash是作为交互式shell启动的,他不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

非交互式shell:系统执行shell脚本用的就是这种shell,不同的地方在于它没有命令行提示符。但当你在系统上运行脚本时,也许希望运行一些特定启动的命令。为了处理这种情况,bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,他会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令。通常包括shell脚本变量设置。

环境变量持久化

对于全局环境变量来说,可能更倾向于将新的或修改过的变量设置放在/etc/profile变量中,但是此种做法有风险,如果升级了所用的发行版,这个文件会更新,那么所设定的变量就可能没有了。最好是在/etc/profile.d目录中创建一个以.sh结尾的文件,把所有新的或修改过的全局环境变量设置放在这个文件中。**在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。**这一点适用于所有类型的shell进程。

7.数组变量

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

$ mytest=(one two three four five)
$

要引用一个单独的数组元素,就必须用代表它在数组中位置的数值索引值,索引值要用方括号括起来。

$ echo ${mytest[2]}
three

要显示整个数组变量,可以用星号作为通配符放在索引值的位置。

$ echo ${mytest[*]}
one two three four five
$

也可以改变某个索引值位置的值。

$ mytest[2]=seven
$
$ echo ${mytest[*]}
one two seven four five

可以使用unset命令删除这个数组。

$ unset mytest
$
$ echo ${mytest[*]}

$

有时候数组很麻烦,所以在shell脚本编程中并不常用。

本章小结

​ 1.全局/局部环境变量。

​ 2.设置,删除环境变量。

参考文献:Linux命令行与shell脚本编程大全(第三版)Richard Blum Christine Bresnahan著 门佳 武海峰译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值