Aug27

【原创】关于shell中变量作用域的思考

Author: leeon  Click: 1020   Date: 2011.08.27 @ 23:35:55 pm Category: linux

执行一个shell脚本会在当前shell中派生一个子shell去执行任务。同理,如果一个shell脚本中调用另一个shell,也是会在执行到子shell这一步的时候再次派生一个子shell去处理脚本。例如a.sh脚本有如下信息:


#!/bin/bash
echo $$
./b.sh

b.sh中有:


#!/bin/bash
echo $$

执行a.sh会发现输出两行不同的进程ID,验证了每个sh在执行的时候会派生一个子shell去执行任务。

在脚本之间调用我们或许会遇到变量之间的调用关系,这里我们需要注意一下几个场景的应用:

场景1, 当前shell中创建一个变量传递给当前脚本派生的子shell,例如:

a.sh


#!/bin/bash
a="TEST"
./b.sh

b.sh


#!/bin/bash
echo $a

这时会发现在b.sh中是无法正常获取到a的变量值的,那么我们可以利用export命令或者set -a命令来使当前shell的变量激活到派生的子shell中。

我们只需要在a.sh中加入


#!/bin/bash
export a="TEST"

或者


#!/bin/bash
set -a
a="TEST"

 

场景2,派生的子shell中的变量在当前父shell中使用,例如:

a.sh


#!/bin/bash
./b.sh
echo $b

b.sh


#!/bin/bash
b="TEST"

我们来执行a.sh会发现输出的b变量为空。那么我们可以使用source命令或者.(点号)来激活子shell中的变量使其能在父shell中使用。

我们只需要修改a.sh,在调用b.sh前加上特殊命令或字符即可,例如:


#!/bin/bash
. ./b.sh
#或者
source ./b.sh


TAG:   shell linux

    评论
    • 提交

    分类

    标签

    归档

    最新评论

    the5fire的博客在12:44:23评论了
    【原创】beautifulsoup解析中文网页乱码解决
    python在12:10:14评论了
    【原创】beautifulsoup解析中文网页乱码解决
    vls在18:02:38评论了
    【原创】使用STL来构造字符串split 和join方法
    john在10:43:23评论了
    【原创】php中ajax异步阻塞解决
    Fang在08:51:00评论了
    java was started but returned exit code=1问题解决小记

    我看过的书

    链接

    其他

    访问本站种子 本站平均热度:1414 c° 本站链接数:55 个 本站标签数:264 个 本站被评论次数:40 次