shell脚本变量作用域的问题


学习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例如:

a="i'm global"
function test(){
    local a
    a="hello i'm local var"
    echo $a
}
test
echo $a

bash中变量默认是全局的这是没错的,对于括号的理解可能有偏差,bash中小括号不同于其他编程语言的作用域的概念,而是,括号中的命令会在一个新的子shell中运行,注意是子shell,子shell是能够访问父shell全局变量的,但是括号内的变量就不能被括号外后面的脚本访问了。 核心要点是,bash小括号中的命令不完全等同于作用域;默认变量是全局的。



相关阅读:
vue怎么加载外部js?????????
如何把一个视图放在左浮动定位的视图的上面?
在线创建站点怎么实现?
cubism.js 怎么用,在哪下载,没有思路
前端包管理器解决方案?
jsoup如何选出没有被隐藏的tr元素
scrapy shell 报错521
server第一次开正常不报错,关闭后报连接错误,第二次再开serve就启动不了,为什么?
正则表达式中/\b\b/出现空字符串个数问题
JS的操作顺序具体是怎样的?
全景展示有人做过吗?给点思路。。。
获取用户ip
屏幕分辨率变大后datatables不对齐如何解决?
Dockerfile build install mysql的时候,弹出输入root密码之后,没反应?
js中promise的嵌套问题
请教大家,我用cmake生成一个最简单的vs2010工程却报错?
eclipse cdt中是否可以和visual c++那样,调试的时候把当前运行箭头指向上下调整
PHP MVC框架如何把控制器值传到模型上?
父页面怎么判断iframe里页面的AJAX加载完成并重新计算高度?
请问 armeabi armeabi-v7a arm64v8a x86 x86_64 mips这些都是啥意思?



快速导航

Copyright © 2016 phpStudy |