Linux Shell变量知识点
变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。
当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。
Linux系统中也有内置或者用户自定义的变量,如何查看呢?查看命令:
env : 查看获取到系统内置的常用环境变量(系统内置变量一般都是以大写字母命名)
set :不但可以查看获取到系统内置的常用变量还可用查看获取到用户自定义的变量
自定义变量
命名规则: 字母、数字、下划线都可以,但首位字符不能使用数字,虽然下划线也可用在首位,但建议不要这样使用。
语法:变量名=变量值 (注意,赋值号"="的 左右不能有空格,这可能和你熟悉的大部分编程语言都不一样。)
变量有特殊字符时,需要用单引号括起来。变量累加时如"a=2, b="a$bc",这时就需要使用双引号来把变量b的值括起来。
全局变量:
全局变量只需定义变量前加入"export"就成为全局变量了,如 "export a='qwa'
但是这个全局变量只作用在当前的"bash"以及它的子"bash"。就好比一个站点目录,在根目录下设置了全局变量,这个目录以及子目录下的所有子目录生效,只能往下一级延伸使用。
取消变量:
有定义变量就有取消变量
语法:unset 变量名 (unset url)
示例:
1,定义"url='http://www.yaho.ac.cn' name='学习笔记' author='yaho',如图1所示。
图1 变量的定义与使用变量
2、更改已定义的变量的值。如图2所示。
图2 更改变量的值
3、变量值中的单引号和双引号的区别
定义变量时,变量的值可以不是有任何引号或由单引号' '
包围,也可以由双引号" "
包围,它们到底有什么区别呢?如图3所示。
图3 单引号与双引号的区别所在
以单引号' '
包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。
以双引号" "
包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;如果需要解析变量或命令时则都要加上双引号,定义变量时加双引号是最常见的使用场景。
4、在系统中查找某个变量,如图4所示。
图4 查找系统变量
使用“set”或者“env”时使用管道符让"less"来查看内容并查找内容,具体需要实际操作才能体会。
5,变量的累加,如图5所示。
图5 变量累加的正确写法
6,全局变量,如图6所示。
上边所说的都是非全局或者本地"localhost"的变量定义,它只能在当前终端下生效。那怎么把定义的变量变成全局的呢?其实很简单,在定义变量前先加入"export"即可成为全局变量,如"export name='yaho' "则这变量"$name"就是全局变量。单全局变量又不像系统中的全局设置那样,它所谓的全局变量只能是在当前终端下的“shell”进程以及子“shell”进程生效,不能往上到父级"shell"进程或者跨越到其他"shell"进程使用,如图6所示。
图6 全局变量的生效条件
图6的结果得出全局变量只能在被定义的它时的所在shell进程以及该shell进程下的子级或子子级等生效,往回到定义该全局变量shell进程的父级shell进程时使用是无效的,只能往下一级生效,不能往上一级生效。
那么在另一个终端下是否能生效呢?我们打开新的终端验证一下,如图7所示。
图7 全局不变不能在其他终端生效
所以, 全局变量生效的条件是:只能在当前的shell进程以及子级或子子级的shell进程生效。
7,取消变量,如需要取消刚刚定义的全局变量"$name"与非全局变量"$web",如图8所示。
图8 取消变量
能定义变量,当然也能取消变量,具体语法如"unset 变量名"即可取消(注意unset与变量名之间要有一个空格)。