资讯详情

资讯详情

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

通过本文能对shell变量有一个系统性的了解具体的包括变量的种类局部、全局、环境变量变量的定义和操作赋值、取值、取消变量变量的作用域文章目录一. 变量的种类1. 全局变量2. 局部变量local3. 环境变量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]$ a99[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(){a99}#调用函数func#输出函数内部的变量echo$a执行shell99通过关键字local可以声明变量仅在函数中生效#!/bin/bash #定义函数 functionfunc(){local a99}#调用函数 func #输出函数内部的变量 echo $a 输出结果为空表明变量 a 在函数外部无效是一个局部变量。3. 环境变量全局变量只在当前 Shell 进程中有效对其它 Shell 进程和子进程都无效。如果使用export命令将全局变量导出那么它就在所有的子进程中也有效了这称为“环境变量”。a. 环境变量的继承父子shell与环境变量的继承环境变量被创建时所处的 Shell 进程称为父进程如果在父进程中再创建一个新的进程来执行 Shell 命令那么这个新的进程被称作Shell 子进程。当 Shell 子进程产生时它会继承父进程的环境变量为自己所用所以说环境变量可从父进程传给子进程。环境变量与父子shell[c.biancheng.net]$a22#定义一个全局变量[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. 赋值变量名和变量值之间没有空格当变量值有空格时必须使用引号括起2. 取值取值时变量名前添加$ 但更严谨的是 ${} 。双引号与单引号变量值引用其他变量值时必须使用双引号因为单引号会阻止Shell解释特殊字符 $。gaoliangMacBook-Pro demo%namejoho gaoliangMacBook-Pro demo%name1$namegaoliangMacBook-Pro demo%echo $name1 joho gaoliangMacBook-Pro demo%name1$namegaoliangMacBook-Pro demo%echo $name1 $name3. 取消变量unset取消变量是将变量从内存中释放使用unset可以实现。gaoliangMacBook-Pro demo%unset Var gaoliangMacBook-Pro demo%echo $Var四. 变量的作用域1. 全局变量的作用域Shell变量的作用域从定义该变量的地方开始到shell结束或是主动使用unset删除该变量的地方为止[roottbds-10-1-0-38 log]# cat nameSpace2.sh#!/bin/bashechobefore func Var1 is$0:$Var1Var1200# 定义函数functionfun1(){Var1121}echobefore func Var1 is$0:$Var1#执行函数fun1echoafter func Var1 is$0:$Var1[roottbds-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有效如下例子[roottbds-10-1-0-38 log]# cat nameSpace1.sh#!/bin/bashVar1100echovar1 is$0:$Var1#调用bashbashnameSpace2.sh[roottbds-10-1-0-38 log]# cat nameSpace2.sh#!/bin/bash# nameSpace1的Var1仅在自己的shell脚本中有效Var1200echoVar1 is$0:$Var1[roottbds-10-1-0-38 log]# bash nameSpace1.shvar1 is nameSpace1.sh:100 Var1 is nameSpace2.sh:2002. 局部变量的作用域添加local指定局部变量[roottbds-10-1-0-38 log]# cat nameSpace2.sh#!/bin/bashVar1200functionfun1(){localVar1121}echobefore func Var1 is$0:$Var1fun1echoafter func Var1 is$0:$Var1#因为局部变量只在函数中起作用所以执行完函数之后输出的值还是全局变量[roottbds-10-1-0-38 log]# bash nameSpace2.shbefore func Var1 is nameSpace2.sh:200 after func Var1 is nameSpace2.sh:200
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →