Shell变量的作用域(Scope),就是Shell变量的有效范围(可以使用的范围)。

在不同的作用域中,同名的变量不会相互干涉,就好像A班有个叫小明的同学,B班也有个叫小明的同学,虽然他们都叫小明(对应于变量名),但是由于所在的班级(对应于作用域)不同,所以不会造成混乱。但是如果同一个班级中有两个叫小明的同学,就必须用类似于“大小明”、“小小明”这样的命名来区分他们。

Shell变量的作用域可以分为三种:

有的变量可以在当前Shell会话中使用,这叫做全局变量(globalvariable);

有的变量只能在函数内部使用,这叫做局部变量(localvariable);

而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environmentvariable)。

全局变量

所谓全局变量,就是指变量在当前的整个Shell会话中都有效。每个Shell会话都有自己的作用域,彼此之间互不影响。在Shell中定义的变量,默认就是全局变量。

想要实际演示全局变量在不同Shell会话中的互不相关性,可在图形界面下同时打开两个Shell,或使用两个终端远程连接到服务器(SSH)。

首先打开一个Shell窗口,定义一个变量a并赋值为99,然后打印,这时在同一个Shell窗口中是可正确打印变量a的值的。然后再打开一个新的Shell窗口,同样打印变量a的值,但结果却为空,如图1所示。

这说明全局变量a仅仅在定义它的第一个Shell中有效,对其它Shell没有影响。这很好理解,就像小王家和小徐家都有一部电视机(变量名相同),但是同一时刻小王家和小徐家的电视中播放的节目可以是不同的(变量值不同)。

需要强调的是,全局变量的作用范围是当前的Shell会话,而不是当前的Shell脚本文件,它们是不同的概念。打开一个Shell窗口就创建了一个Shell会话,打开多个Shell窗口就创建了多个Shell会话,每个Shell会话都是独立的进程,拥有不同的进程ID。在一个Shell会话中,可以执行多个Shell脚本文件,此时全局变量在这些脚本文件中都有效。

例如,现在有两个Shell脚本文件,分别是a.sh和b.sh。a.sh的代码如下:

#!/bin/bashecho$ab=200

b.sh的代码如下:

#!/bin/bashecho$b

打开一个Shell窗口,输入以下命令:

$a=99

$../a.sh

99

$.b.sh

200

$

从输出结果可以发现,在Shell会话中以命令行的形式定义的变量a,在a.sh中有效;在a.sh中定义的变量b,在b.sh中也有效。

局部变量

Shell也支持自定义函数,但是Shell函数和C/C++、Java等其他编程语言函数的一个不同点就是:在Shell函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。请看下面的代码:

#!/bin/bash#定义函数functionfunc(){a=99}#调用函数func#输出函数内部的变量echo$a

输出结果:

99

a是在函数内部定义的,但是在函数外部也可以得到它的值,证明它的作用域是全局的,而不是仅限于函数内部。

要想变量的作用域仅限于函数内部,那么可以在定义时加上local命令,此时该变量就成了局部变量。请看下面的代码:

#!/bin/bash#定义函数functionfunc(){locala=99}#调用函数func#输出函数内部的变量echo$a

输出结果为空,表明变量a在函数外部无效,是一个局部变量。

Shell变量的这个特性和JavaScript中的变量是类似的。在JavaScript函数内部定义的变量,默认也是全局变量,只有加上var关键字,它才会变成局部变量。

环境变量

全局变量只在当前Shell会话中有效,如果使用export命令将它导出,那么它就在所有的子Shell中也有效了,这称为“环境变量”。

环境变量被创建时所处的Shell被称为父Shell,如果在父Shell中再创建一个Shell,则该Shell被称作子Shell。当子Shell产生时,它会继承父Shell的环境变量为自己所用,所以说环境变量可从父Shell传给子Shell。不难理解,环境变量还可以传递给孙Shell。

注意,环境变量只能向下传递而不能向上传递,即“传子不传父”。

在一个Shell中创建子Shell最简单的方式是运行bash命令

通过exit命令可以一层一层地退出Shell。

下面演示一下环境变量的使用:

$a=22#定义一个全局变量

$echo$a  #在当前Shell中输出a,成功

22

$bash  #进入子Shell

$echo$a  #在子Shell中输出a,失败

$exit  #退出子Shell

exit

$exporta  #将a导出为环境变量

$bash  #重新进入子Shell

$echo$a  #在子Shell中再次输出a,成功

22

$exit  #退出子Shell

exit

$exit  #退出父Shell,结束整个Shell会话

可以发现,默认情况下,a在子Shell中是无效的;使用export将a导出为环境变量后,在子Shell中就可以使用了。

exporta这种形式是在定义变量a以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作exporta=22。

注意,本节我们一直强调的是环境变量在子Shell中有效,并没有说它在所有的Shell种有效;如果你通过终端创建一个新的Shell,那么它就不是当前Shell的子Shell,环境变量对这个Shell就是无效的。

此外,通过export命令导出的环境变量是临时的,关闭Shell会话后它就销毁了。所以,这种环境变量也只是在局部范围内起作用,并不影响所有Shell。

如果想让环境变量在所有Shell中都有效,并且能够永久保存,在关闭Shell后也不丢失,那么就需要把环境变量写入启动文件。至于如何写入文件,请大家自行百度,这里就不再赘述了。

linux shell变量作用域,Shell变量的作用域:Shell全局变量、环境变量和局部变量相关推荐

  1. Linux基础(管道符、重定向、转义字符与环境变量)

    1.输入输出重定向 简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中. 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从 ...

  2. 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》

    前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...

  3. Linux下代码运行不了?看这里设置环境变量

    Linux环境变量设置 前言 环境变量文件 环境变量设置(vim/gedit) 配错了怎么办? 前言 首先呢,环境变量有系统环境变量和用户环境变量.介个系统环境变量影响着整个系统,而用户环境变量也就顾 ...

  4. linux添加include环境变量,Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

    Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量 15:12) 标签: 编译器 Linux 分类: 转载一些有用的文章 (2012-01-31 对所有用户有效在/etc/prof ...

  5. postman使用———(一)登录获取token设置全局变量/环境变量

    一.登录获取token 可以通过接口文档或抓包工具获取登陆的地址和参数,先登录,查看返回的结果.如图我需要用的参数是token和userid #二.设置全局变量 使用json提取器提取需要的字段并设置 ...

  6. centos 配置php开发环境变量配置,CentOS中配置PHP和Nginx环境变量

    搜索热词 一.摘要 在Linux CentOS系统上 安装完PHP和Nginx后,一般需要执行查看版本命令'PHP -v'和'Nginx -v',确认是否安装成功,如果在没有添加到环境变量之前,执行& ...

  7. python需要配置环境变量吗_教你手动设置python环境变量

    在Windows系统上安装Python非常简单,从头到尾只要跟着步骤走,一路点击"NEXT"按钮即可.最重要也是最麻烦的是安装完毕后需要手动设置下环境变量,到了这一步,很多朋友都不 ...

  8. 环境变量配置的方法选择与如何配置环境变量

    提示:Windows系统下,环境变量的原理和配置方法 一.为什么要配置环境变量? 环境变量是操作系统指定其特定运行环境的参数,包含应用程序所需使用的信息. 在Windows系统下,我们桌面的快捷方式, ...

  9. shell脚本编程学习笔记4(xdl)——Bash常见环境变量

    shell脚本编程学习笔记4--Bash常见环境变量 非专业运维,例如开发人员,环境变量熟悉常见的,了解不常见的即可. 1,简介 环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量, ...

  10. linux某个目录环境变量,在linux下加环境变量或者是把某个目录加到环境变量

    1.直接用export命令:#export PATH=$PATH:/opt/au1200_rm/build_tools/bin查看是否已经设好,可用命令export查看:[[email protect ...

最新文章

  1. 如何使用WindowsLiveWriter发文章
  2. php 最大数字,PHP 计算至少是其他数字两倍的最大数的实现代码
  3. 一文彻底理解Java单元测试
  4. djandgo model id
  5. mysql web日志_mysql日志管理
  6. 2清空所有表_拉链表(二)
  7. 相亲对象能有多油腻......
  8. mysql Split函数
  9. select * from什么意思_SQL入门教程第15课:什么是内连接
  10. Atitit.attilax的 case list 项目经验 案例列表
  11. .net framework 3.5win10无法安装,一招解决win10无法安装.NET Framework 3.5
  12. Python爬虫实战:《战狼2》豆瓣影评分析
  13. mc java送win10_微软针对Windows 10的免费Minecraft赠品在Java播放器的午夜结束
  14. 苏宁618强势出圈,差异化竞争能力是杀手锏
  15. 形容芝士蛋糕好吃的句子精选
  16. 【Vuejs】1454- 深入了解 vue-cli
  17. 在财报发布前,美光科技值得买入吗?
  18. OpenCV(4.0.0) Error: Assertion failed (dst.data == (uchar*)dst_ptr) in cvShowImage
  19. stm32定时器中断配置及使用
  20. 三角翼航模尾翼混控原理探索

热门文章

  1. essential-phone的相关体验
  2. 浏览器截图插件什么的弱爆了
  3. kafka Centos7.2 单机集群搭建
  4. anuglar.js ui-router传递参数
  5. JavaScript多浏览器兼容
  6. c#设计模式-适配器模式
  7. Flutter中State深入分析理解
  8. JavaScript中的Math方法演示
  9. java基础——Vector集合知识点
  10. Word+Excel 问题及解决