学习shell脚本时,看到这么一个知识点:
【圆括号结构,能强制将其中的命令运行在子shell中】
现有测试脚本代码如下:
#圆括号结构用法
#!/bin/bash
echo "Father Shell is: $BASH_SUBSHELL" #打印父shell的层次,为0
outervar=OUTER #父shell的变量outervar
( #利用圆括号结构创建子shell
echo "SubShell is: $BASH_SUBSHELL" #子shell的层次为1
(
echo "GrandSubShell is: $BASH_SUBSHELL" #孙shell的层次为2
)
innervar=INNER #子shell的变量
echo "innervar=$innervar"
echo "outervar=$outervar" #outervar继承了符shell所赋给它的值
) #回到父shell
echo "Father Shell is: $BASH_SUBSHELL"
if [ -z "$innervar" ] #子shell中定义变量为空,则说明
then
echo "The \$innervar is not defined in main body."
else
echo "The \$innervar is defined in main body."
fi
输出结果如下图
问题:为什么脚本中语句echo "outervar=$outervar"可以获取到上一层shell所设立的变量outervar=OUTER?
PS:我记得必须使用export使一个变量变为shell的环境变量,子shell才能获取到。这里并没有使用 export outervar=OUTER ,但是也获取到值了
bash中变量默认是全局变量,无论这个变量是在什么位置(在函数中也一样),如果要使用局部变量,需要使用 local例如:
bash中变量默认是全局的这是没错的,对于括号的理解可能有偏差,bash中小括号不同于其他编程语言的作用域的概念,而是,括号中的命令会在一个新的子shell中运行,注意是子shell,子shell是能够访问父shell全局变量的,但是括号内的变量就不能被括号外后面的脚本访问了。 核心要点是,bash小括号中的命令不完全等同于作用域;默认变量是全局的。