通过上篇的介绍,应该是几乎囊括了所有关于变量的知识了,因为这部分是通过看了两本书及每个点都搜了网上几乎这方面的东西最后总结的,这里只想补充一下关于 set,unsett与 export。
我们在上一篇知道env可以打印系统中所有的环境变量,但是如果想看看系统中的局部变量呢,这时候就是要用到set了。
set用于显示与设置当前本地 变量。单独一个set 就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量
unset 用于清除变量。不管这个变量是环境变量还是本地变量,它都可以清除。
例如下面的例子显示设置 var=123 然后 set | grep var显示该变量,然后unset 则清除了这个变量
[root@localhost Desktop]# var=123
[root@localhost Desktop]# set|grep var
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
MAIL=/var/spool/mail/root
XAUTHORITY=/var/run/gdm/auth-for-root-XZY60F/database
var=123
[root@localhost Desktop]# unset var
[root@localhost Desktop]# set|grep var
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
MAIL=/var/spool/mail/root
XAUTHORITY=/var/run/gdm/auth-for-root-XZY60F/database
_=var
再看下面的情形
利用文本编辑器编辑如下:
#!/bin/sh
# try export
#menogenFang 2014.4.15
echo $name
然后在在终端中设置name,观察下面
[root@localhost Desktop]# set | grep name
[root@localhost Desktop]# name=menogen
[root@localhost Desktop]# ./b.sh
[root@localhost Desktop]# echo $name
menogen
也就是说当你在终端设置变量时候,想利用b.sh脚本来显示,但并非能如愿,显然,b.sh并没有看到用户在终端中定义的name变量。可见,在终端中设置的变量,在运行的shell脚本中是无法看到的.同样,终端也无法改变shell脚本里面设置的变量的值。
这是因为在Shell工作机制中,存在一个子shell的概念,上面的情形展现的就是子shell的形象。子shell是登录shell为了运行某个脚本程序而建立的一个全新的shell,这个全新的shell只会使用自己的局部变量,却见不到父shell(登录shell)的局部变量。而且,子shell和父shell对对方的局部变量都不会有任何交集,井水不犯河水。
那如果我们想要父shell与子shell能够交互,能够看到同一个变量呢,这时候就需要export了
利用文本编辑还是上面的例子
#!/bin/sh
# try export
#menogenFang 2014.4.15
echo $name
然后在终端如下操作:
[root@localhost Desktop]# name=menogen
[root@localhost Desktop]# export name
[root@localhost Desktop]# ./b.sh
menogen
这时候,我们的脚本程序已经看到了name的值了,因为export将name导出
但如果在本身的脚本中已经定义了name,那么他优先看到的是局部变量
#!/bin/sh
# try export
#menogenFang 2014.4.15
name="fang"
echo $name
在终端中:
[root@localhost Desktop]# name=menogenfang
[root@localhost Desktop]# export name
[root@localhost Desktop]# ./b.sh
fang
这个时候,即使export也没能使脚本中的name发生改变。
总结起来,当使用export来导出一个变量时,当前shell就会将此变量放到“导出变量列表”中,一旦在某个时刻需要建立子shell时,就会将这个导出变量列表拷贝一份给子shell,这样子shell也就有所应当的看到了这些被导出的变量了。先将我们一直在用的name unset掉。再来看看下面的
[root@localhost Desktop]# unset name
[root@localhost Desktop]# name=fang
[root@localhost Desktop]# set| grep name
name=fang
[root@localhost Desktop]# env| grep name
[root@localhost Desktop]# exprot name
bash: exprot: command not found
[root@localhost Desktop]# export name
[root@localhost Desktop]# env| grep name
name=fang
利用set可以看到我们设置的变量值,但是利用env看不到,但是如果使用了export,那么env可以看到,也就是说,export后的变量变成了临时的环境变量,为什么说是临时的,因为在下一次系统启动时候,他是不见了的,而不像$PATH等这样的永久的环境变量,要想让name 成为永久的环境变量,就得修改我们上一篇说到的关于环境变量中/ext 及~下的那些关于shell环境变量的文件了