函数变量概览
变量类型 普通变量(全局变量)环境变量局部变量
函数变量概览
变量作用域: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]#
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)