具体代码如下:
[root:~/caodalin]# cat test.sh # 第一层脚本
#! /bin/sh
declare -x shell_name="/root/caodalin" # 定义全局变量
echo test.shell_name:${shell_name} # 结果1
sh ./test1.sh # 调用第二层脚本
sh ./test2.sh # 调用第二层脚本
echo test.shell_name:${shell_name} # 打印调用后的全局变量 结果6
[root:~/caodalin]# cat test1.sh # 第二层脚本
#! /bin/sh
shell_name=${shell_name}"/test1" # 引用第一层脚本定义的全局变量更新变量值
echo test1.shell_name:${shell_name} # 打印更新后的全局变量 结果2
sh ./test2.sh # 调用第三层脚本
echo test1.shell_name:${shell_name} # 打印调用后的全局变量 结果4
[root:~/caodalin]# cat test2.sh
#! /bin/sh
shell_name=${shell_name}"/test2"
echo test2.shell_name:${shell_name} # 打印调用后的全局变量 结果3 结果5
[root:~/caodalin]# ./test.sh # 执行第一层脚本
test.shell_name:/root/caodalin # 结果1
test1.shell_name:/root/caodalin/test1 # 结果2
test2.shell_name:/root/caodalin/test1/test2 # 结果3
test1.shell_name:/root/caodalin/test1 # 结果4
test2.shell_name:/root/caodalin/test2 # 结果5
test.shell_name:/root/caodalin # 结果6
由以上结果可以看出变量传递的一些规律:
结果1,结果6同在test.sh中,没有更新变量操作,所以两个结果一致;
结果2,结果4同在test1.sh中,期间没有更新变量操作,所以两个结果也是一致;
结果3,结果5同在test2.sh中,但因为结果3是test1.sh为父脚本,所以引用的变量值是test1.shell_name;结果5是test.sh为父脚本,所以引用的变量值是test.shell_name。
总结:子脚本可以引用父脚本中"declare -x"的变量;子脚本对引用的变量改变后只在当前脚本有效,返回父脚本后改变无效,即父脚本无法使用子脚本的变量。