news 2026/11/3 9:10:18

shell基础之变量(2):变量有哪些种类、怎么定义/赋值/取值、不同种类变量的作用域

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
shell基础之变量(2):变量有哪些种类、怎么定义/赋值/取值、不同种类变量的作用域

通过本文能对shell变量有一个系统性的了解,具体的包括:

  1. 变量的种类:局部、全局、环境变量
  2. 变量的定义和操作:赋值、取值、取消变量
  3. 变量的作用域

文章目录

  • 一. 变量的种类
    • 1. 全局变量
    • 2. 局部变量:local
    • 3. 环境变量
      • a. 环境变量的继承
      • b. 预设的环境变量
  • 二. 变量命名
  • 三. 变量操作
    • 1. 赋值:
    • 2. 取值:
    • 3. 取消变量:unset
  • 四. 变量的作用域
    • 1. 全局变量的作用域
    • 2. 局部变量的作用域

变量指向一片用于存储数据的内存空间。
shell变量是一种弱类型的变量,即在声明变量时不需要指定其类型。

一. 变量的种类

1. 全局变量

所谓全局变量,就是指变量在当前的整个 Shell 进程中都有效。每个 Shell 进程都有自己的作用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量。

需要强调的是,全局变量的作用范围是当前的 Shell 进程,而不是当前的 Shell 脚本文件,它们是不同的概念。

打开一个 Shell 窗口就创建了一个 Shell 进程,打开多个 Shell 窗口就创建了多个 Shell 进程,每个 Shell 进程都是独立的,拥有不同的进程 ID。在一个 Shell 进程中可以使用 source 命令执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

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

[c.biancheng.net]$ a=99[c.biancheng.net]$../a.sh99[c.biancheng.net]$../b.sh200

这三条命令都是在一个进程中执行的,从输出结果可以发现,在 Shell 窗口中以命令行的形式定义的变量 a,在 a.sh 中有效;在 a.sh 中定义的变量 b,在 b.sh 中也有效,变量 b 的作用范围已经超越了 a.sh。

2. 局部变量:local

默认情况下:

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

如下shell 列子:

#!/bin/bash#定义函数functionfunc(){a=99}#调用函数func#输出函数内部的变量echo$a
执行shell99

通过关键字local可以声明变量仅在函数中生效

#!/bin/bash #定义函数 functionfunc(){local a=99}#调用函数 func #输出函数内部的变量 echo $a 输出结果为空,表明变量 a 在函数外部无效,是一个局部变量。

3. 环境变量

全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。

如果使用export命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量”。

a. 环境变量的继承

父子shell与环境变量的继承:

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


环境变量与父子shell

[c.biancheng.net]$a=22#定义一个全局变量[c.biancheng.net]$echo$a#在当前Shell中输出a,成功22##进入shell子进程 ing[c.biancheng.net]$bash#进入Shell子进程[c.biancheng.net]$echo$a#在子进程中输出a,失败[c.biancheng.net]$exit#退出Shell子进程,返回上一级Shellexit#将a导出为环境变量 子进程可以查到[c.biancheng.net]$exporta[c.biancheng.net]$bash#重新进入Shell子进程[c.biancheng.net]$echo$a#在子进程中再次输出a,成功22# 通过exit命令可以一层一层地退出 Shell。[c.biancheng.net]$exit#退出Shell子进程exit[c.biancheng.net]$exit#退出父进程,结束整个Shell会话

注意:如果通过终端创建了一个新的 Shell 窗口,那它就不是当前 Shell 的子进程,环境变量对这个新的 Shell 进程是无效的。

b. 预设的环境变量

可以使用echo命令查看变量的值

bash-3.2$ ECHO $PATH/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public #(重设)添加路径到PATH # 仅对当前shell有效 bash-3.2$exportPATH=/somepath/path:$PATH bash-3.2$ echo $PATH/somepath/path:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public


二. 变量命名

shell中的变量必须以字母或者下划线开始,变量是区分大小写的


三. 变量操作

1. 赋值:

  1. 变量名和变量值之间没有空格
  2. 当变量值有空格时必须使用引号括起

2. 取值:

  • 取值时变量名前添加$ ,但更严谨的是 ${} 。
  • 双引号与单引号:变量值引用其他变量值时必须使用双引号,因为单引号会阻止Shell解释特殊字符 $。
gaoliang@MacBook-Pro demo%name=joho gaoliang@MacBook-Pro demo%name1="$name"gaoliang@MacBook-Pro demo%echo $name1 joho gaoliang@MacBook-Pro demo%name1='$name'gaoliang@MacBook-Pro demo%echo $name1 $name

3. 取消变量:unset

取消变量是将变量从内存中释放,使用unset可以实现。

gaoliang@MacBook-Pro demo%unset Var gaoliang@MacBook-Pro demo%echo $Var


四. 变量的作用域

1. 全局变量的作用域

Shell变量的作用域:

  • 从定义该变量的地方开始到shell结束
  • 或是主动使用unset删除该变量的地方为止
[root@tbds-10-1-0-38 log]# cat nameSpace2.sh#!/bin/bashechobefore func Var1 is$0:$Var1Var1=200# 定义函数functionfun1(){Var1=121}echobefore func Var1 is$0:$Var1#执行函数fun1echoafter func Var1 is$0:$Var1[root@tbds-10-1-0-38 log]# bash nameSpace2.shbefore func Var1 is run_quan.sh: before func Var1 is run_quan.sh:200 after func Var1 is run_quan.sh:121


全局变量只在当前shell有效,如下例子:

[root@tbds-10-1-0-38 log]# cat nameSpace1.sh#!/bin/bashVar1=100echovar1 is$0:$Var1#调用bashbashnameSpace2.sh[root@tbds-10-1-0-38 log]# cat nameSpace2.sh#!/bin/bash# nameSpace1的Var1仅在自己的shell脚本中有效,Var1=200echoVar1 is$0:$Var1[root@tbds-10-1-0-38 log]# bash nameSpace1.shvar1 is nameSpace1.sh:100 Var1 is nameSpace2.sh:200

2. 局部变量的作用域

添加local指定局部变量

[root@tbds-10-1-0-38 log]# cat nameSpace2.sh#!/bin/bashVar1=200functionfun1(){localVar1=121}echobefore func Var1 is$0:$Var1fun1echoafter func Var1 is$0:$Var1#因为局部变量只在函数中起作用,所以执行完函数之后,输出的值还是全局变量[root@tbds-10-1-0-38 log]# bash nameSpace2.shbefore func Var1 is nameSpace2.sh:200 after func Var1 is nameSpace2.sh:200
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 9:10:08

【wordcount】flink 代码快速入门

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:08:17

STM32G071RB隔离SPI实战:从地环路到数字隔离器调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:08:16

基于ESP32与电子墨水屏的冰箱购物清单同步方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:08:03

基于MAX14431与PIC18LF46K40的隔离型SPI通信链路设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:07:11

工业级SPI隔离通信实战:MAX14431与K60的10MHz链路设计与踩坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:06:58

STM32 SPI隔离设计实战:MAX14431BAEE+解决共模干扰

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华