IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 28. shell当中的函数变量作用域变量类型普通变量全局变量环境变量局部变量详解和示例 -> 正文阅读

[系统运维]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]#
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:28:28  更:2022-02-03 01:30:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 8:39:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码