文章目录
函数变量概览
变量作用域: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]#