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

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

作者:互联网

文章目录


函数变量概览

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

变量类型

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

普通变量(全局变量)

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

终端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。

#!/bin/bash
echo "$a"
b=20
[root@mdns zaishu]#a=10	#定义普通变量
[root@mdns zaishu]#./funs	#执行脚本发现a的值为空,互不影响,执行脚本相当于单独开启了shell进程 

[root@mdns zaishu]#echo $b	#输出为空

例如,现在有两个 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

[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]#

标签:mdns,Shell,变量,示例,作用域,zaishu,进程,root
来源: https://blog.csdn.net/wangzhicheng987/article/details/122762186