colorful

zc qq:1337220912

 

变量在shell脚本间的传递

前几篇文章中已经介绍过局部变量和环境变量的含义,接下来我们来拓展下,看看变量怎样实现在shell脚本
中的传递shell脚本其实是用当前shell的子shell去执行的,所以在shell脚本中定义的普通变量只适用于当前
shell的子shell环境,也就是说在当前shell环境中不适用,也不适用于这个shell脚本的子shell。
在shell脚本中定义的环境变量可以传承给它的子shell,但是也不能传递给当前shell(不能逆向传递)
如果在一个脚本中需要执行另一个脚本,并且运用其中的变量,改如何申明变量呢,我们来看一个例子:
/root/test1.sh内容如下:
#!/bin/bash
aaa=yuanfaxiang
echo "test1:$aaa"

/root/test2.sh内容如下:
#!/bin/bash
/root/test1.sh
echo "test2:$aaa"
执行test2.sh结果如下:
[root@centos ~]# sh test2.sh
test1:yuanfaxiang
test2:
从结果可以看出test1.sh没有把变量aaa的值传递给test2.sh

我们把test2.sh改成:
#!/bin/bash
source /root/test1.sh
echo "test2:$aaa"
执行test2.sh结果如下:
[root@centos ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
结果显示test2.sh继承了test1.sh中定义的变量aaa。
原因分析:在第一次执行test2.sh时,test1.sh被作为了test2.sh的子shell来执行,其中定义的变量只
在test1.sh中起效,不能逆向传递到test2.sh中;而在第二次执行中,采用source来执行test1.sh,意思
是直接把test1.sh在当前的test2.sh中执行,没有作为子shell去执行,test1.sh中定义的变量,就影响
到了test2.sh。

如果我们再建一个test3.sh
#!/bin/bash
echo "test3:$aaa"

把test2.sh改成:
#!/bin/bash
source /root/test1.sh
echo "test2:$aaa"
/root/test3.sh
执行test2.sh:
[root@shenji ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
test3:
结果显示test3.sh没有继承test1.sh中申明的变量,因为source /root/test1.sh只是让test1.sh
中的变量在test2.sh中生效,aaa毕竟还是个普通局部变量,并不能被test3.sh这个子shell所继承,
所以我们可以想到环境变量,把aaa变成test2.sh这个脚本的环境变量,让test2.sh的子进程也能继承。

将test1.sh改成:
#!/bin/bash
export aaa=yuanfaxiang
echo "test1:$aaa"
执行test2.sh后有如下结果:
[root@shenji ~]# sh test2.sh
test1:yuanfaxiang
test2:yuanfaxiang
test3:yuanfaxiang
在test1.sh中声明了环境变量也就是全局变量,在test2.sh中用source执行test1.sh,将变量带到了
test2.sh中,并使之成为test2.sh执行过程中的环境变量,可以被test2.sh的子进程继承,起到了顺向
传递效果。

posted on 2013-09-11 13:37 多彩人生 阅读(657) 评论(0)  编辑 收藏 引用 所属分类: linux program


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜