2.3.3 嵌套shell
学习目标
这一节,我们从 export原理、嵌套实践、小结 三个方面来学习。
export原理
原理解析
用户登录时:
用户登录到Linux系统后,系统将启动一个用户shell。
在这个shell中,可以使用shell命令或声明变量,也可以创建并运行 shell脚本程序。
运行脚本时:
运行shell脚本程序时,系统将创建一个子shell。 此时,系统中将有两个shell
- 一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。
当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。
意义解读
从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。
在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。
export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
实践解读
当前父shell中定义变量中,分为局部变量和全局变量,不同点是:
- 局部变量只能作用于本父shell,子shell无法继续使用
- 如果使用了export将局部变量定义为全局变量,那么子shell创建的时候会继承父shell的全局变量
嵌套实践
简单实践
查看父shell的脚本
[root@localhost ~]# cat father.sh
#!/bin/bash
# 定制全局变量
export _xing='王'
_name="书记"
_age="42"
echo "父shell信息: $_xing$_name,$_age"
sleep 3
# 调用child.sh进行验证,最好放在同一目录下
/bin/bash child.sh
echo "父shell信息: $_xing$_name,$_age"
查看子shell的脚本
#!/bin/bash
# 显示父shell的全局变量
echo "子shell信息: $_xing$_name,$_age"
# 同名变量 子shell 的优先级高于父shell,但是不会传递给父shell
_xing="王胖胖"
echo "子shell修改后的信息: $_xing"
执行测试效果
[root@localhost ~]# /bin/bash father.sh
父shell信息: 王书记,42
子shell信息: 王,
子shell修改后的信息: 王胖胖
父shell信息: 王书记,42