>[success] # 变量作用域 ~~~ 1.跟其他编程语言一样变量也存在作用域 2.Shell 变量的作用域可以分为三种: 2.1.有的变量只能在函数内部使用,这叫做局部变量(local variable); 2.2.有的变量可以在当前 Shell 进程中使用,这叫做全局变量(global variable); 2.3.而有的变量还可以在子进程中使用,这叫做环境变量(environment variable)。 ~~~ >[danger] ##### 局部变量 ~~~ 要想变量的作用域仅限于函数内部,可以在定义时加上local命令,此时该变量就成了局部变量。请看下面的代码: #!/bin/bash #定义函数 function func(){ local a=99 } #调用函数 func #输出函数内部的变量 echo $a 输出结果为空,表明变量 a 在函数外部无效,是一个局部变量。 ~~~ >[danger] ##### Shell 全局变量 ~~~ 1.在 Shell 中定义的变量,默认就是全局变量。 2.开一个 Shell 窗口,定义一个变量 a 并赋值为 99,然后打印,这时在同一个 Shell 窗口中是可正确打印变量 a 的值的。然后再打开一个新的 Shell 窗口,同样打印变量 a 的值,但结果却为空,这说明全局变量 a 仅仅在定义它 的第一个 Shell 进程中有效,对新的 Shell 进程没有影响 3.打开一个 Shell 窗口就创建了一个 Shell 进程,打开多个 Shell 窗口就创建了多个 Shell 进程,每个 Shell 进程都 是独立的,拥有不同的进程 ID ~~~ >[danger] ##### Shell 环境变量 ~~~ 1.自定义环境变量,'export 变量名=变量值',使用export命令将全局变量导出,那么它就在所有的子进程中也有效了, 环境变量被创建时所处的 Shell 进程称为父进程,如果在父进程中再创建一个新的进程来执行 Shell 命令,那么这个 新的进程被称作 Shell 子进程。当 Shell 子进程产生时,它会继承父进程的环境变量为自己所用,所以说环境变量可 从父进程传给子进程 2.创建 Shell 子进程最简单的方式是运行 bash 命令 3.注意这里说的是子进程,而不是像'Shell 全局变量' 中说的那样新开窗口,而是使用base命令 4.通过 export 导出的环境变量只对当前 Shell 进程以及所有的子进程有效,如果最顶层的父进程被关闭了, 那么环境变量也就随之消失了,其它的进程也就无法使用了,所以说环境变量也是临时的 ~~~ ~~~ [c.biancheng.net]$ a=22 #定义一个全局变量 [c.biancheng.net]$ echo $a #在当前Shell中输出a,成功 22 [c.biancheng.net]$ bash #进入Shell子进程 [c.biancheng.net]$ echo $a #在子进程中输出a,失败 [c.biancheng.net]$ exit #退出Shell子进程,返回上一级Shell exit [c.biancheng.net]$ export a #将a导出为环境变量 [c.biancheng.net]$ bash #重新进入Shell子进程 [c.biancheng.net]$ echo $a #在子进程中再次输出a,成功 22 [c.biancheng.net]$ exit #退出Shell子进程 exit [c.biancheng.net]$ exit #退出父进程,结束整个Shell会话 ~~~ >[danger] ##### 查看环境变量 ~~~ 1.'env' 2.输出常见的环境变量 echo $HOSTNAME echo $SHELL echo $HISTSIZE echo $SSH_CLIENT echo $USER ~~~ * 常用环境变量 ![](https://img.kancloud.cn/be/2a/be2a29c8bf7e4d35f6da3e347a862312_597x169.png) | 变量名 | 含义 | 示例 | | --- | --- | --- | | HOSTNAME | 主机名 | HOSTNAME=localhost | | SHELL | 当前的shell | SHELL=/bin/bash | | HISTSIZE | 历史命令条数 | HISTSIZE=1000 | | SSH\_CLIENT | 当前操作环境如果是用SSH连接的话,这里会记录客户端IP | SSH\_CLIENT=192.168.1.100 57596 22 | | USER | 当前登录的用户 | USER=root | >[info] ## 参考 [# Shell变量的作用域:全局变量、环境变量和局部变量](http://www.beylze.cn/shell/703.html)