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

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

 

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

 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ cat -n var1.sh  
  2. 1    #!/bin/bash  
  3. 2    echo :$myvar:  
 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ myvar=hello  
  2. [rocrocket@rocrocket SHELL]$ echo $myvar  
  3. hello  
 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ bash ./var1.sh  
  2. ::  
 

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

 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ cat -n var2.sh  
  2.      1  #!/bin/bash  
  3.      2  myvar=50  
  4.      3  echo :$myvar:  
 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ myvar=100  
  2. [rocrocket@rocrocket SHELL]$ echo $myvar  
  3. 100  
  4. [rocrocket@rocrocket SHELL]$ bash var2.sh  
  5. :50:  
 

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

 

阶段总结:

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

 

引子:

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

 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ cat -n var3.sh  
  2.      1  #!/bin/bash  
  3.      2  echo mylocal=$mylocal  
  4.      3  echo myglobal=$myglobal  
 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ mylocal=1  
  2. [rocrocket@rocrocket SHELL]$ myglobal=2  
  3. [rocrocket@rocrocket SHELL]$ bash var3.sh  
  4. mylocal=  
  5. myglobal=  
 

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

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ export myglobal  
  2. [rocrocket@rocrocket SHELL]$ bash var3.sh  
  3. mylocal=  
  4. myglobal=2  
 

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

 

阶段总结:

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

 

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

 

引子:

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

 

情景四:看看整个过程:

C代码   收藏代码
  1. [rocrocket@rocrocket SHELL]$ export myglobal=10  
  2. [rocrocket@rocrocket SHELL]$ cat -n var4.sh  
  3.      1  #!/bin/bash  
  4.      2  myglobal=33  
  5.      3  echo myglobal=$myglobal  
  6. [rocrocket@rocrocket SHELL]$ bash var4.sh  
  7. myglobal=33  
  8. [rocrocket@rocrocket SHELL]$ echo $myglobal  
  9. 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~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机网络期末复习题 201708-201801计算机网络复习指导发布-校考学生!!下载截止于12.5日晚上9点 2017-12-04 23:07 计算机网络复习指导-校内考试 §1.名词解释: 1. 计算机网络 2.网络体系结构 3.高速以太网 4.静态路由选择 5. 动态路由选择 6.子网掩码 8.动态主机配置协议 9.套接字 10.客户/服务器模型(C/S模型) 11.域名系统(DNS) 12.光纤分布式数据接口FDDI §2.简答题: 1.试谈你对网络安全的威胁和防病毒技术的认识。(线下教学课件) 2.简述物理层的四个特性。(线下教学课件) 3.计算机网络的组成(P2-P3) 4.计算机网络的功能(P3) 5.计算机网络标准化的相关组织(P4+线下教学课件) 6.计算机网络的性能指标(P8+线下教学课件) 7.简述你所知道的网络传输介质(P33-34) 8.物理层的四个特性(P34) 9.简述四种帧边界的划分方法(即组帧方法)。(P52-54+线下教学课件) 10.简述停止-等待流量控制(协议)。(P59+P62-P64+线下教学课件) 11.简述时分多路复用(P69+线下教学课件) 12.简述频分多路复用(P68+线下教学课件) 13.简述IPv4地址的分类(P122-123) 14.UDP数据报与IP分组的区别(P187) §3.论述题: 1.试说明数据链路层原语和协议的转换。(线下教学课件) 2.描述常规释放的过程,并画出其示意图。(线下教学课件) 3.奈奎斯特定理公式和香农定理公式的主要区别是什么? 4.试比较电路交换、报文交换和分组交换等三种数据传输方式。(P27-29) 5.谈谈你对差错控制方法的理解。(P54-58+线下教学课件) 6.谈谈域名解析过程(P225-226) 7.ARP和DNS是否有些相似?它们有何区别?(P227) 8.FTP的工作原理。(P228)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值