28. shell当中的函数变量作用域,变量类型,普通变量,全局变量,环境变量,局部变量详解和示例

文章目录


函数变量概览

变量作用域:Shell 变量的作用域,就是 Shell 变量的有效范

变量类型

  • 普通变量也叫全局变量。普通变量的作用范围是当前shell脚本程序文件,包括脚本中的函数。

  • 环境变量:当前shell和子shell有效,变量可以在子进程中使用。

  • 本地变量:变量只能在函数内部使用,伴随函数的生命周期;函数结束时变量被自动销毁

注意:如果函数中定义了普通变量,且名称和局部变量相同,则使用本地变量。

普通变量(全局变量)

普通变量,对在当前Shell都有效。shell当中定义的变量默认就是全局变量。每个进程都有自己的作用域,彼此互不影响。

  • 两个终端
    打开两个终端窗口,定义一个变量a,然后打印输出。另外的终端窗口打印是空。
终端1️⃣
[root@mdns zaishu]#a=10
[root@mdns zaishu]#echo $a
10
终端2️⃣
[root@mdns zaishu]#echo $a

[root@mdns zaishu]#

说明全局变量 仅仅在定义它的第一个 Shell 进程中有效,对新的 Shell 进程没有影响。全局变量的作用范围是当前的 Shell 进程,当打开一个 Shell 窗口就创建了一个 Shell 进程,打开多个 Shell 窗口就创建了多个 Shell 进程,每个 Shell 进程都是独立的,拥有不同的进程 ID。

  • 终端和执行的脚本
    在shell当中执行脚本,相当于开启了一个新的子shell,与当前shell是不同进程。所以普通变量不会作用脚本中。
#!/bin/bash
echo "$a"
b=20
[root@mdns zaishu]#a=10	#定义普通变量
[root@mdns zaishu]#./funs	#执行脚本发现a的值为空,互不影响,执行脚本相当于单独开启了shell进程 

[root@mdns zaishu]#echo $b	#输出为空
  • 普通变量转变为环境变量
    在当前 Shell 进程中使用 source 命令执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

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

fun1.sh 的代码如下:
#!/bin/bash
echo $a
b=20
fun2.sh 的代码如下:
#!/bin/bash
echo $b

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

[root@mdns zaishu]#a=99
[root@mdns zaishu]#source fun1.sh
99

[root@mdns zaishu]#source fun2.sh
20
[root@mdns zaishu]#echo $b
20

三条命令在一个进程中执行的,从输出结果可以发现,这些变量相当于变成了环境变量,对当前进程和子进程都生效。

环境变量

普通变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。通环境变量则对所有的子进程中也有效。

环境变量被创建时所处的 Shell 进程称为父进程,如果在父进程中再创建一个新的进程来执行 Shell 命令,那么这个新的进程被称作 Shell 子进程。当 Shell 子进程产生时,它会继承父进程的环境变量为自己所用,所以说环境变量可从父进程传给子进程。

创建 Shell 子进程最简单的方式是运行 bash 命令。通过exit命令可以一层一层地退出 Shell。

  • 环境变量演示:
[root@mdns zaishu]#a=10  #定义一个全局变量
[root@mdns zaishu]#echo $a
10
[root@mdns zaishu]#bash #进入子进程
[root@mdns zaishu]#echo $a #没有输出
[root@mdns zaishu]#

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

[root@mdns zaishu]#a=10
[root@mdns zaishu]#export a #将a导出为环境变量
[root@mdns zaishu]#bash
[root@mdns zaishu]#echo $a
10

export a可以将它导出为环境变量,如果同时定义为环境变量,可以写为
export a=10

  • 永久生效环境变量
    export 导出的环境变量只对当前 Shell及所有的子进程有效,如果最顶层的父进程被关闭了,那么环境变量也就随之消失了,其它的进程也就无法使用了,所以说环境变量也是临时的。
    将变量写入 Shell 配置文件可以永久生效环境变量。
[root@mdns zaishu]#cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH
export a=10
[root@mdns zaishu]#source ~/.bash_profile 
[root@mdns zaishu]#echo $a
10

局部变量

在 Shell 函数中定义的变量默认是全局变量,它和在函数外部定义变量拥有一样的效果。

#!/bin/bash
#定义函数
function func() {
    a=18
}
#调用函数
func
#输出函数内部的变量
echo $a
[root@mdns zaishu]#./funs2.sh 
18

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

要想变量的作用域仅限于函数内部,可以在定义时加上local命令,此时该变量就成了局部变量。

#!/bin/bash
#定义函数
function func() {
    local a=18 #定义为局部变量
}
#调用函数
func
#输出函数内部的变量
echo $a

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

[root@mdns zaishu]#./funs2.sh 
[root@mdns zaishu]#
上一篇:今日份收获


下一篇:基于微服务和Docker的PaaS云平台架构设计