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

2023-05-16

通过本文能对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.sh
99
[c.biancheng.net]$ . ./b.sh
200

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

 

2. 局部变量:local

默认情况下:

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

如下shell 列子:

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

 

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

#!/bin/bash
#定义函数
function func(){
    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子进程,返回上一级Shell
exit
#将a导出为环境变量 子进程可以查到
[c.biancheng.net]$ export a   
[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$ export PATH=/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/bash
echo before func Var1 is $0:$Var1
Var1=200
 
# 定义函数
function fun1(){
        Var1=121
}
 
echo before func Var1 is $0:$Var1
#执行函数
fun1
echo after func Var1 is $0:$Var1
 
 
[root@tbds-10-1-0-38 log]# bash nameSpace2.sh 
before 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/bash
Var1=100
echo var1 is $0:$Var1
#调用bash
bash nameSpace2.sh

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


[root@tbds-10-1-0-38 log]# bash nameSpace1.sh 
var1 is nameSpace1.sh:100
Var1 is nameSpace2.sh:200

 

2. 局部变量的作用域

添加local指定局部变量

[root@tbds-10-1-0-38 log]# cat nameSpace2.sh 
#!/bin/bash
Var1=200
 
function fun1(){
        local Var1=121
}
 
echo before func Var1 is $0:$Var1
fun1
echo after func Var1 is $0:$Var1
#因为局部变量只在函数中起作用,所以执行完函数之后,输出的值还是全局变量
[root@tbds-10-1-0-38 log]# bash nameSpace2.sh 
before func Var1 is nameSpace2.sh:200
after func Var1 is nameSpace2.sh:200

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Qt Quick 3D系列(四):为三维模型添加动画效果

    Qt Quick 3D旨在让那些熟悉QML开发的人能够使用非常少的学习成本实现3D开发 xff0c 因此对于三维模型动画没有类似与Qt 3D中有个专门的Qt3DAnimation来控制动画效果 xff0c 而是直接使用QML中的Animat
  • Qt Quick 3D系列(五):三维模型展示示例

    为了展示一个好看的3D模型 xff0c 需要对模型设置背景 xff0c 设置三维材质 xff0c 设置周围光线 xff0c 设置模型阴影等等 下面示例展示了一个比较好看的三维模型效果 xff0c 大家可以先在C4D等调整好模型效果 xff0
  • QML 地图可拖拽位置标签组件

    在地图上显示位置信息时 xff0c 有时候需要同时显示该位置的详细信息 该组件可在地图上显示一个连接到地图地理位置的标签框 xff0c 该标签框可点击进行拖拽 在地理位置改变 地图缩放 地图平移时 xff0c 该标签框的相对位置保持不变 x
  • 使用QQuaternion对Qt Data Visualization中模型进行旋转

    在Data Visualization中 xff0c 三维显示的OBJ需要旋转时使用rotation属性 xff0c 但是该属性传入的值是一个四元数QQuaternion xff0c 直接赋值四元数很复杂 xff0c 因此使用转化的方式获得
  • QML 可拖拽边框和顶点调整大小组件(新增对主窗口支持)

    QML项目开发过程中 xff0c 有时候需要对控件大小和位置 进行人为调整 xff0c 因此设计该组件 该组件鼠标置于边框和顶点位置时鼠标样式对应改变 xff0c 拖动边框可修改该方向组件大小 xff0c 拖动顶点可修改组件处横纵向组件大小
  • QML 地图修改插件源码(五),Map添加自定义地图类型,并动态修改地图类型

    QML的地图Map中提供了属性activeMapType MapType用于设置当前地图的类型 xff0c 以OSM地图插件为例 xff0c OSM地图提供了多种地图类型 xff0c 下面介绍如何修改OSM插件的源码添加需要的地图类型 xf
  • Qt使用QQuaternion对空间矢量QVector3D进行旋转

    空间中的QVector3D既可以代表空间中的点位置 xff0c 也可以表示空间矢量 为什么要对空间矢量进行旋转呢 xff0c 比如有一个空间矢量在空间中代表了镜头前进的方向 xff08 即第一人称模式 xff09 xff0c 初始时该矢量指
  • QML实现双屏显示

    QML程序中需要分别在主屏幕和分屏幕上显示不同的界面内容 xff0c 但又为了不同界面间能够进行数据交互 xff0c 因此使用如下方法实现双屏显示 xff0c 即由主窗口生成第二个窗口 xff0c 将该窗口移动到第二个屏幕上 xff0c 实
  • ubuntu设置默认内核启动的方法

    本文介绍ubuntu设置默认内核启动的方法 参考如下图 xff0c 修改grub文件 xff1a 修改后 xff0c 执行 xff1a sudo update grub amp amp reboot
  • QML自定义的日历控件

    QML中提供了日历的控件Calendar xff0c 但该控件为QtQuick Controls 1中提供的控件 xff0c 因此只能使用QtQuick Controls Styles的方式对该控件进行设置 xff0c 效果如图 xff1a
  • QML地图Map中使用QPainterPath,并显示任意点经纬度位置

    QML地图Map中提供了供绘制图形的组件 xff0c 例如MapPolyline xff0c MapCircle等 xff0c 但是这些组件在绘制复杂轨迹时就显得功能不够全面 xff0c 因此我将QPainterPath在Map中进行使用并
  • QML地图绘制虚线

    QML提供了MapPolyline用于在地图上绘制线段 xff0c 该线段是实线 xff0c 因此我使用Canvas自定义绘制的方式在地图上绘制线段 xff0c 如图 xff1a 鼠标在地图上点击后 xff0c 在点击位置添加图标 xff0
  • QML无边框最大化窗口时遮住了任务栏,程序默认置顶的问题

    在QML窗口使用无边框 xff0c 并且默认程序最大化显示后 xff0c 此时程序显示默认自动变成了全屏显示 xff0c 程序自动遮挡住了系统任务栏 当使用多屏幕显示时 xff0c 切换不同程序 xff0c 该QML程序的界面显示错误 使用
  • 用VScode写C/C++,从下载安装到配置使用

    介绍 编程的过程大致分为编写代码 代码编译 代码执行三步 xff0c vscode可以完成代码编写 xff0c 但是不能进行编译 也就是将代码翻译为计算机可以听懂的话 xff0c MinGW可以完成这个任务 xff0c 二者配合可以实现在v
  • 深度学习训练降低显存指南

    一 小模块API参数inplace设置为True xff08 省一点点 xff09 比如 xff1a Relu 有一个默认参数inplace xff0c 默认设置为False xff0c 当设置为True时 xff0c 计算时的得到的新值不
  • C++工程师学习内容

    C 43 43 是最贴近底层编程语言 在性能方面上 xff0c 有着无可替代的优势特别是对于很多游戏开发公司来说 xff0c C 43 43 尤其适合作为后端服务的开发语言 在一些对于并发性能要求较高的业务上 xff0c C 43 43 也
  • Ubuntu 更新apt出错

    输入sudo apt get update后出现 Err 1 http us archive ubuntu com ubuntu xenial InRelease Temporary failure resolving 39 us arch
  • 使用OpenWrt开发嵌入式Linux(二):先让系统跑起来(使用initramfs)

    安装相关工具 推荐使用ubuntu 16及以上版本 sudo apt install gcc binutils bzip2 flex python perl make diffutils unzip gawk subversion zlib
  • 使用kubeadm从0到1搭建kubernete集群

    目录 概述 安装前提示 安装docker 安装kubeadm 安装kubernete集群master节点 安装 kubeadm kubectl kubelet组件 安装kubernete master节点 安装CNI网络插件 部署集群wor
  • shell基础之变量(2):变量有哪些种类、怎么定义/赋值/取值、不同种类变量的作用域

    通过本文能对shell变量有一个系统性的了解 xff0c 具体的包括 xff1a 变量的种类 xff1a 局部 全局 环境变量变量的定义和操作 xff1a 赋值 取值 取消变量变量的作用域 文章目录 一 变量的种类1 全局变量2 局部变量