本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。

如果你对子Shell的概念不甚了解,如果你对export的用法还没吃透,如果你不知道Shell如何管理你的变量,请阅读本文。否则,请复习本文。^_^

情景一:建立一个shell脚本var1.sh,其内容为:

[rocrocket@rocrocket SHELL]$ cat -n var1.sh
1    #!/bin/bash
2    echo :$myvar:

然后在终端上执行变量赋值语句并用echo显示此变量:

[rocrocket@rocrocket SHELL]$ myvar=hello
[rocrocket@rocrocket SHELL]$ echo $myvar
hello

但是当执行var1.sh脚本,想显示myvar变量时,情况却并非你所愿:

[rocrocket@rocrocket SHELL]$ bash ./var1.sh
::

显然,var1.sh并没有看到用户在终端中定义的myvar变量。可见,在终端中设置的变量,在运行的shell脚本中是无法看到的。

情景二:我们建立一个脚本var2.sh,内容为:

[rocrocket@rocrocket SHELL]$ cat -n var2.sh1   #!/bin/bash2    myvar=503  echo :$myvar:

此时,用户在终端设置myvar的值并显示此值,然后再运行var2.sh,看看结果吧:

[rocrocket@rocrocket SHELL]$ myvar=100
[rocrocket@rocrocket SHELL]$ echo $myvar
100
[rocrocket@rocrocket SHELL]$ bash var2.sh
:50:

可见,终端中设置的值,在shell脚本中是无法改变的;而且,终端也无法改变shell脚本里面设置的变量的值。

阶段总结:

在Shell工作机制中,存在一个子shell的概念,上面的两个情景展现的就是子shell的形象。子shell是登录shell为了运行某个脚 本程序而建立的一个全新的shell,这个全新的shell只会使用自己的局部变量,对父shell(登录shell)的局部变量不屑一顾。而且,子 shell和父shell对对方的局部变量都不会有任何冒犯,井水不犯河水。

引子:

有些事情偏偏是需要子shell和父shell有所交互的,这就需要有一个变量是子shell和父shell都能看到和修改的。这时候,export出现了,它可以“导出变量”。

情景三:建立一个新的shell脚本var3.sh,其内容如下:

[rocrocket@rocrocket SHELL]$ cat -n var3.sh1 #!/bin/bash2    echo mylocal=$mylocal3 echo myglobal=$myglobal

在var3.sh脚本中,设置了两个变量,一个是mylocal,表示局部变量,一个是myglobal,表示全局变量。
在终端上给此两个变量赋值,然后执行脚本程序var3.sh,很明显,结果如你所愿,是空值:

[rocrocket@rocrocket SHELL]$ mylocal=1
[rocrocket@rocrocket SHELL]$ myglobal=2
[rocrocket@rocrocket SHELL]$ bash var3.sh
mylocal=
myglobal=

我们针对myglobal执行export来导出变量,再看看结果:

[rocrocket@rocrocket SHELL]$ export myglobal
[rocrocket@rocrocket SHELL]$ bash var3.sh
mylocal=
myglobal=2

看,我们的脚本程序已经看到了myglobal的值了,看来export将myglobal导出,真是起到作用了。

阶段总结:

他的内幕是这样的:当使用export来导出一个变量时,当前shell就会将此变量放到“导出变量列表”中,一旦在某个时刻需要建立子shell时,就会将这个导出变量列表拷贝一份给子shell,这样子shell也就有所应当的看到了这些被导出的变量了。

(为了能让10岁以前小朋友看懂,更形象的说:从前有个母亲叫shell,shell她手里攥着“导出变量列表”和“局部变量列表”两件宝贝,当 shell生育了小孩(名叫子shell)的时候,她就把“导出变量列表”这件宝贝复制一份,交给她的孩子,而shell手里的另一件宝贝“局部变量列 表”则不会交给小孩)

引子:

现在子shell如果想改变这份“导出变量列表”中的某些内容,那么父shell到底能不能察觉呢?父shell会不会随着子shell一起修改这些值呢?

情景四:看看整个过程:

[rocrocket@rocrocket SHELL]$ export myglobal=10
[rocrocket@rocrocket SHELL]$ cat -n var4.sh1   #!/bin/bash2    myglobal=333   echo myglobal=$myglobal
[rocrocket@rocrocket SHELL]$ bash var4.sh
myglobal=33
[rocrocket@rocrocket SHELL]$ echo $myglobal
10

可见,在子shell是无法改变父shell中的“导出变量列表”中变量的值的。子shell只能修改自己手里的那份“导出变量列表”中变量的值。

阶段总结:

子shell是无法改变父shell中的“导出变量列表”中变量的值的。
变量一旦被导出,对所有后续执行的子shell,该变量都是导出变量。

关于export -p:

可以执行export -p来查看当前shell的导出变量列表。这其中一定是包括了从父shell继承来的导出变量列表。

全文总结:

1 没有导出的变量是局部变量,子shell是看不到的。
2 导出变量列表被复制给子shell,子shell可以修改和存取它,但是这种修改父shell看不到。
3 导出变量列表的上述特性对于直接产生的子shell生效,对于由子shell产生的后继子shell也是如此。
4 export可以在变量赋值之后用,也可以在变量赋值之前用。

over~

原文:http://roclinux.cn/?p=1277

Shell编程中的“局部变量”和“导出变量” (export 用法)相关推荐

  1. shell 不等于_关于shell编程中的整数值比较的两种方式的简单操作实例

    谈一谈关于shell编程中的整数值比较的两种方式 Shell编程有时处理一个对象时,需要我们对对象进行测试. 只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错. 这个测试的对象可以是文件. ...

  2. shell编程中for/while/util/case/select/break/continue

    2019独角兽企业重金招聘Python工程师标准>>> Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for.while和until.w ...

  3. linux shell let命令,shell编程中的let与(())

    let与(()) 在shell编程中是可以互换的:它们在循环语句中控制变量变化非常有用: 使用let语句或者(())我们可以像C语言那样写程序~ 对于变量赋值,判断什么的不用繁琐的$VAR, -eq等 ...

  4. shell编程中特殊字符的问题总结

    shell编程中特殊字符的问题总结 --同事王怡春的总结: 近日在编写shell脚本的遇到的一些问题,然后上网搜搜学习后,以下是总结后的版本,给大家分享,如有问题,错误,欢迎指正 一 通配符( * ) ...

  5. 掌握shell编程中数组的常见用法及示例

    From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2386.html 给大家分享下数组的用法小例子,希望能给大家一点帮助. ...

  6. 轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  7. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

  8. ll文件显示为?????_关于shell编程中的文件测试简单的操作实例

    谈一谈关于shell编程中的文件测试 Shell编程有时处理一个对象时,需要我们对对象进行测试. 只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错. 这个测试的对象可以是文件.字符串.数字 ...

  9. 并发编程中的锁、条件变量和信号量

    在并发编程中,经常会涉及到锁.条件变量和信号量.本文从并发开始,探究为什么需要它们,它们的概念,实现原理以及应用. 并发简介 并发是指多个事情,在同一时间段内同时发生了.和并发经常一起被提到的是并行. ...

最新文章

  1. Ubuntu下mysql字符集设置
  2. mysql 服务器 管理_MySQL服务器组件
  3. 发布可伸缩超网SCARLET,小米AutoML团队NAS三部曲杀青
  4. iOS self 和 super 学习
  5. c++电费管理系统_能耗管理系统
  6. IOS精品源码,仿探探UIButton封装iOS提示弹框迅速引导页自定义导航栏
  7. maven scope-provided 与 optional 区别
  8. gc:C语言的垃圾回收库-中文
  9. Linux 发行版本简介 (zz)
  10. volatile和synchronized关键字
  11. Oracle数据库执行Sql脚本
  12. 打印浏览器文章为pdf
  13. 乐优商城(14)–订单服务
  14. 直接修改gba_gba修改教程完全版
  15. 使用开放的showapi接口小技巧
  16. 操作系统原理与Linux实践教程申丰山版习题2的2-3答案
  17. 国内有哪些不错的计算机视觉团队?
  18. 应用程序现代化权威指南
  19. 推荐算法之DeepFM
  20. 深入理解网络通信与tcp/ip协议

热门文章

  1. 买铅笔(洛谷-P1909)
  2. 信息学奥赛C++语言:趣味整数4(水仙花数)
  3. 46 SD配置-销售凭证设置-分配状态参数文件到项目类型
  4. opengl png图片 qt_Qt资源文件的格式,并用CMake添加Qt资源文件
  5. 一起学习C语言:初谈指针(二)
  6. python绘制糖葫芦_python简单爬虫(一)
  7. 读取文本节点_我最喜爱的Dynamo节点TOP 10
  8. Docker如何删除一个镜像
  9. python将mat文件转为png
  10. TTSR再次理解,主要是针对Texture Transformer TT的全部过程的一个梳理