1、定义变量的规则
在定义变量时,有一些规则需要遵守
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是
2name
则是错误的。 - 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
-
变量用等号连接值,等号左右两侧不能有空格。
-
变量的值如果有空格,需要使用单引号或双引号包括。如:
test="hello world!"
。其中双引号括起来的内容$
、\
和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。 - 在变量的值中,可以使用“\”转义符。
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含
"$变量名"
或用${变量名}
包含变量名(就相当于Java中字符串连接)。例如:
#叠加变量 test,变量值变成了123456
[root@localhost ~ ] # test=123
[root@localhost ~ ] # test="$test"456
[root@localhost ~ ] # echo $test
123456
#再叠加变量 test,变量值变成了123456789
[root@localhost ~ ] # test=${test}789
[root@localhost ~ ] # echo $test
123456789
总结:变量值的叠加可以使用两种格式:
"$变量名"
或${变量名}
- 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或
$( )
包含命令。之前说过,例如:
[root@localhost ~ ] # test=$(date)
[root@localhost ~ ] # echo $test
2018年10月21日星期一20:27:50 CST
- 环境变量名建议大写,便于和命令区分。
2、变量的分类
shell中变量的分类并不是安装变量的类型进行分类的。
- 用户自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。(只在当前shell中生效,子shell中不生效)
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。
说明:环境变量分为两种,一种是允许用户自定义的,还有一种是系统定义好的。用户定义的这种环境变量,对整个操作系统的环境来说作用不是很大,唯一的作用就是,在父子shell中都生效(这个以后再说)。而系统定义的环境变量,会对我们的操作环境产生一定影响。对系统定义的环境变量,我们不能修改变量的名称和作用,只能修改变量的属性值。系统定义的环境变量主要就是在几个重要的环境变量配置文件中的变量,如
/etc/profile
文件中的变量。
提示:环境变量的作用域是整个系统都生效,包括父shell子shell。在这种情况下,为了避免和系统命令产生冲突,建议环境变量的名称都是大写(主要是自定义的环境变量,系统定义的环境变量一般都是大写的,也不能改),因为Linux系统中所有的系统命令都是小写(只有大写的命令选项),这样就可以避免混淆了。
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。(位置参数变量其实就是预定义变量中的一个类型)
预定义变量和位置参数变量一共就几种,需要记住(以后详细讲)。
一、用户自定义变量
1、变量定义
- 变量正确定义
格式:变量名="变量值"
[root@localhost ~ ] # name=zhenniubi
[root@localhost ~ ] # name="zhen niubi"
- 变量名不能用数字开头。
[root@localhost ~ ] # 2name="zhen niubi"
-bash:2name=zhen niubi:command not found
- 等号左右两侧不能有空格。
[root@localhost ~ ] # name = "zhenniubi"
-bash:name:command not found
- 变量的值如果有空格,必须用引号包含。
[root@localhost ~]#name=zhen niubi
-bash:niubi:command not found
2、变量调用
调用变量用$
符号。
#定义变量name
[root@localhost ~ ] # name="zhen niubi"
#输出变量name的值
[root@localhost ~ ] # echo $name
zhen niubi
3、变量的修改
shell中变量值的修改,是以覆盖的形式完成的,以后最后一次对该变量的赋值为准。
#之前定义好的变量
[root@localhost ~]# name=ailin
[root@localhost ~]#
[root@localhost ~]# echo $name
ailin
#修改后的变量值
[root@localhost ~]# name=cangls
[root@localhost ~]#
[root@localhost ~]# echo $name
cangls
4、查看变量
命令格式:[root@localhost ~ ] # set [选项]
选项:
-u
:如果设定此选项,调用未声明变量时会报错(默认无任何提示)(很常用)。-x
:如果设定此选项,在命令执行之前,会把命令先输出一次。(不建议使用)
-u
选项说明:
在当前系统下从没有定义过age字段(变量),直接输出age变量的值,如下图可以看到没有任何值。
如果我给age字段定义一个空值,在查看age字段,如下图,可以看到依旧没有任何输出。
那么综上所述,查看一个变量时没有任何输出,是有两种可能的。一种是age变量不存在,一种是age变量的值为空。在Java中,变量没有被定义和变量值为空完全是两个不同的概念,在shell中也一样,我们一定要对此进行区分。
如果我执行了set -u
命令,就可以对上面两种情况进行区分。
#直接执行`set -u`命令
[root@localhost ~ ] # set -u
#输出一个未定义变量,显示addr变量不存在。
[root@localhost ~]# echo $addr
-bash: addr: unbound variable
#给addr变量定义一个空值,
#在查看变量,可以看到变量的值为空。
[root@localhost ~]# addr=""
[root@localhost ~]# echo $addr
[root@localhost ~]#
注意:在命令行中执行
set -u
命令,这种方式是临时生效的,需要永久生效,就需要写入环境变量配置文件中。(如何配置,看以后的环境变量配置内容)
总结:当设置了
-u
选项后,如果调用没有设定的变量会有报错。默认是没有在何输出的。
-x
选项说明:
就字面意思,如果设定了-x
选项,会在每个命令执行之前,先把命令输出一次
[root@localhost ~ ] # set -x
[root@localhost ~ ] # ls
+ ls --color=auto
anaconda-ks.cfg install.log install.log.syslog sh tdir test testfile
如果不新登陆系统,会一直这样,因为上面说了,在命令行中直接执行是临时生效的。并不推荐执行此选项,命令结果看起来很乱。
set命令说明:
直接使用set命令,不加任何选项,会查询系统中所有的变量,包含用户自定义变量和环境变量。(其实是一部分)
系统的另一部分变量,用env命令来查看。两个命令看到的变量会有重叠,但是env命令查看不到自定义变量的。(查了一下,网上介绍的也很模糊,就是两个命令就能够查到系统中全部的变量,set多用于查看系统的用户自定义变量,env多用于查询系统的环境变量。)
总结:
set
:用来显示当前shell的变量,包括当前用户的变量。
每个shell有自己特有的变量,这个和用户变量是不同的,当前用户变量和你用什么shell无关,不管你用什么shell,每个shell都有自定义的shell,也就是自己shell的变量。这种变量不同shell是不同的,这些变量只有set才会显示,是bash特有的。这种变量也只对本shell有效, 不能传递给子shell。(就相当于Java中的局部变量)。env
:用来显示环境变量,也叫显示当前用户的变量,环境变量可传递给子shell。(就相当于Java中的全局变量)
5、变量删除
[root@localhost ~ ] # unset 变量名
不需要在变量名前加
$
符号,只有在调用变量值的时候需要在变量名前加$
符号。