shell编程bash环境变量
一、什么是环境变量
1、用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
也就是说本地变量属于局部变量,而环境变量则属于全局变量。他们的区别是作用的范围不同。
二、设置环境变量
我们设置本地变量,也就是自定义变量的格式是:变量名=变量值。
而设置环境变量只需要在变量名前面添加export即可,代表把这个变量声明为全局变量。
1、子shell切换。
我们前面学习过可以用csh命令切换到csh命令行下,用sh可以切换到sh命令行下,那么自然我们也可以再用bash命令切换到子bash下面,也就是说的子shell,这个子shell可以是csh也可以是sh,也可以是任意的bash。
如图:
上面我们都做了什么呢?
我们先进入了csh,又进入了sh,然后退出sh回到csh,又退出csh回到bash,有退出,就直接退出bash,退出shell操作界面而logout登出了。
那么我们也可以直接在bash的shell界面下再进入子bash的shell界面,那么怎么查看是在哪个shell界面下呢?
我们可以直接用pstree命令来查看进程树,就直接能看到我们在哪个shell下面了如图:
图中显示了两个bash就说明我们是在子bash下面,如果这时候我们用exit退出一下,再去查看就会只有一个bash了。
上图├─sshd───sshd───bash───bash───pstree这行进程树就告诉我们,我们是在子bash下面操作了pstree命令,父bash是通过sshd远程终端连接到服务器的,用的是ssh服务。
2、我们来演示一下本地变量和全局变量的区别。
首先我们声明一个本地变量,再声明一个全局变量,如下:
[root@localhost ~]# name=mageo
[root@localhost ~]# export age=18
然后我们用set在当前bash下查看一下变量,如图:
是不是无论是本地变量和全局变量都能看的到啊,那如果我们切换到子bash下面呢?
[root@localhost ~]# bash 这样就切换到子bash下了,我们再用set查看一下
[root@localhost ~]# set
如图:
是不是本地变量就看不到了啊。
这就是本地变量和全局变量的区别。
那么已经设置为本地变量的变量能不能修改为全局变量呢?当然可以,下面操作:
[root@localhost ~]# export name
也就是把刚才的本地变量设置成全局变量,大家再去用set在子bash下面就可以查看到设置好的全局变量了。当然我们需要先退出到父bash下才能进行更改。
3、[root@localhost ~]# env
查询变量
前面我们学习过用set来查询变量,用set查询的是所有的变量,包括本地和全局。
而env命令是专门用来查看环境变量的,就不演示了,大家自己尝试。
4、调用环境变量和清空环境变量。
大家只要记住,只要是bash变量,调用的方法和删除的方法都是一样的。
调用变量就直接在变量前面加’$’符号。
删除变量就直接用unset+变量名即可。
三、系统常见环境变量
其实环境变量用不到我们添加,一般只用系统自带的环境变量就够用了,也就是我们用env命令查看到的这些命令,这里只讲几个常用的环境变量。
1、PATH:系统查找命令的路径
前面学习bash命令别名的时候我们接触过。那么系统环境变量PATH就是设置系统命令查找的路径的。
我们用env查看一下,如图:
那么我们用echo来调用一下。
[root@localhost ~]# echo $PATH
如图:
是不是echo来的值就是变量PATH的值啊。
那么我们看到了PATH变量的值是一个一个的路径用冒号分隔开来的,这个变量的作用是什么呢?
前文讲过,我们任何一个命令的正常执行方法都是必须要用命令的绝对路径或相对路径,但是为什么系统命令不用呢?比如ls ,比如pwd,为什么可以直接使用,而不用写全路径呢?这就是因为这些系统命令已经用环境变量PATH设置过了,只要我们输入相应的命令,系统就会在PATH设置的路径里进行查找,只要找到就执行,如果输入一个错误的命令,而PATH设置的路径里都找不到,那就会报错。这就是这个环境变量的作用。
那么比如我们编写一个可执行的脚本文件,正常我们必须写全这个脚本的路径,我们才能让这个脚本执行,那是不是我们把这个脚本文件复制到PATH已经设置的路径里面,比如:/root/bin下,那是不是我们就不用写这个文件的路径,也可以像系统命令一样直接执行呢?答案是肯定的,大家可以试试。
但是不建议大家把自己写的脚本或命令添加到环境变量里面,容易变得复杂,会把自己都搞晕的。
同样我们用TAB路径补全功能补全命令的时候,也就默认在PATH设置的路径下进行查找的,找到就补全。
所以这个PATH环境变量是一个非常重要的变量。
2、PATH=”$PATH”:/root/
PATH变量叠加。
那么上面说了不建议大家把自己的脚本程序或命令放入到系统命令的目录来达到可以直接执行的目的。
但是我们就是想让我们的命令可以不用写路径就能执行怎么办呢?
其实我们前面学习过变量叠加。
我们就可以用变量叠加功能把我们某一个想设定的目录添加进去,比如/root/mageo路径添加到PATH变量里面,这样只要是在/root/mageo里面的执行文件都不用写路径就可以直接执行了。
看,我们把我们写好的hello.sh脚本复制到/root/mageo里面,然后用变量叠加功能把/root/mageo路径给添加到PATH变量原来值的后面,这样一来我们无论在哪个目录里,我们都可以直接执行hello.sh,而不用写路径了。
我们来看一下PAHT变量值的变化,如图:
是不是多了我们添加的路径啊。当然我们在这里添加是临时的,要想永久生效需要修改配置文件才可以。
3、PS1:定义系统提示符的变量
这是我们要讲的第二个比较重要的环境变量。
那么其实这个变量算不上环境变量,因为大家可以试试用env命令是查不到这个变量的,我们只能用set查看所有变量才能查看的到,如图:
而虽然这个变量用env命令查不到,但是他确实系统预留的一专门设置系统操作环境的变量,其实他是环境变量当中的一个子分支,只是用env查不到而已。
好的我们来看看这个变量值的含义:
A、\d:显示日期,格式为”周 月 日”
B、\h:显示简写主机名。如默认主机名”localhost”
C、\t:显示24小时制时间,格式为”HH:MM:SS”
D、\T:显示12小时制时间,格式为”HH:MM:SS”
E、\A:显示24小时制时间,格式为”HH:MM”
F、\u:显示当前用户名
G、\w:显示当前所在目录的完整名称
H、\W:显示当前所在目录的最后一个目录
I、\#:执行的第几个命令
J、\$:提示符。如果是root用户会显示提示符为”#”,如果是普通用户会显示提示符为”$”
我们来看看这个变量的默认值,如图:
[root@localhost tmp]# echo $PS1
[\u@\h \W]\$大家仔细看这个格式其实就是[root@localhost tmp]#
\u代表显示当前用户,而我们当前用户就是root
@没有含义直接输出
\h代表显示当前主机名,我们当前主机名就是localhost
\W显示当前所在目录的最后一个目录,我们现在就在tmp目录下呢
\$代表身份提示符,而我们现在是管理员身份就是’#’
那么组合到一起是不是就是[root@localhost tmp]# 啊。
所以这个PS1变量是干这个来用的。
4、PS1变量修改
那么我们也可以把PS1变量值修改为我们自己定制的显示方式,但是注意设置的时候变量值一定要用单引号括起来,不然里面的一些字符是会被转义的。
例如:
[root@localhost tmp]# PS1='[\u@\t \w]\$ ‘
也就是修改为显示当前用户+当前时间+完整目录名称,如图:
是不是按照我们的格式变了。
这是个非常有意思的变量,我们可以自己随便按照含义表来修改这个变量来达到定制我们的命令行提示的界面,甚至我们可以直接这样做:
[root@01:48:28 ~]# PS1='[\u ]\$ ‘
也就是只显示用户和用户权限。
虽然这个变量好玩,但是还是不建议大家去修改,因为如果每个人都习惯了自己的格式的话,那么团队作业就乱套了,相互之间操作会非常别扭的。
本教程原创作者:mageo,出自每集博客,尊重作者劳动,转载请注明出处:http://www.ql2015.cn,谢谢!