Linux自定义变量的声明、调用、查看和删除(非常全面,附带实例)
在 Linux 中,用户自定义变量是最常用的变量类型,也称作本地变量,其特点是变量名、变量的作用和变量值都是由用户自由定义的,但要注意,可以自定义的前提是名称不能和系统中已经存在的变量名冲突。
在定义时变量有一些需要遵守的变量定义规则,如果不遵守规则,那么变量的定义将会执行失败,例如:
例如,之前已经对 moto 进行了赋值,随后发现赋值后的结果并不那么准确,此时可以使用重新赋值的方式进行修改:
接下来,在现有基础上我们继续针对变量 moto 增加值,使用变量叠加的方式:
但是在变量叠加时需要注意调用变量值的格式。如果出现在变量名后的第一个字符是字母或数字,那么通常不能准确地调用变量值,例如:
我们之所以能够成功对变量 moto 进行变量叠加,是因为 shell 变量名中只能包含字母、数字,以及下画线。而变量 name1 在变量叠加时加入的字符是 -RC,也就是说跟在变量名 moto 后的第一个字符是“-”。因此,系统认为“-”之前的字符串是一个独立的变量名,“-”及后续字符串是需要变量叠加的内容。
任何空白字符或标点符号(下画线除外)都足以提示变量名的结束位置,但如果变量名后是数字或字母,就需要加入大括号“{}”来表示变量名。加入大括号后,执行结果如下:
但是,如果不知道变量名,怎样查询系统中有哪些存在的变量呢?只需使用 set 命令即可。set 命令可以用来查看系统中的大多数变量(包括用户自定义变量和两种环境变量,不包括预定义变量和位置参数变量)和设定 shell 的执行环境,其格式如下:
set 命令执行结果如下:
set -u 选项主要用于区分未声明变量和赋值为空的变量,在默认情况下,如果不开启 set -u 选项,那么调用一个未声明变量的返回结果,与调用变量值为空的结果相同。在执行过 set -u 选项后,就可以轻易区分出变量值为空和变量未声明的情况,具体如下:
接下来是执行 set 命令中的 -x 选项:
因为是清空变量,而不是调用变量值,所以在变量名前不需要加入“$”符号。举例说明:
即便是同一个用户在不同终端登录,也无法调用相同用户在不同终端声明的用户自定义变量。同时,因为变量声明占用的是内存空间,所以如果只在命令行中声明自定义变量,就会造成系统重启,最终导致变量被清除。
Linux自定义变量的声明和调用
声明用户自定义变量的格式如下:变量名=变量值例如:
[root@localhost ~]# moto="FF" #变量名为moto,变量值为“FF” [root@localhost ~]# echo $moto FF #使用echo并在变量名前加入“$”符号,就可以调用变量moto的值
在定义时变量有一些需要遵守的变量定义规则,如果不遵守规则,那么变量的定义将会执行失败,例如:
[root@localhost ~]# 2moto=FF -bash: 2moto=FF: command not found #变量名可以由字母、数字和下画线组成,但不能以数字开头 [root@localhost ~]# moto = "FF" -bash: moto: command not found #变量名与变量值之间用等号连接,等号两侧不能有空格 [root@localhost ~]# moto=F F -bash: F: command not found #变量值如果有空格,就必须写在单引号或双引号中才能赋值成功 [root@localhost ~]# moto="F F" #赋值成功在部分情况下,变量已经进行过赋值了,但我们仍需要在之前的基础上继续对变量进行赋值,在这种情况下,我们有两个选择:
- 第一,可以重新对变量进行赋值;
- 第二,我们可以选择使用变量叠加的方式。
例如,之前已经对 moto 进行了赋值,随后发现赋值后的结果并不那么准确,此时可以使用重新赋值的方式进行修改:
[root@localhost ~]# echo $moto FF [root@localhost ~]# moto=FF-GSX #重新对 moto 进行赋值,变量值为 FF-GSX [root@localhost ~]# echo $moto FF-GSX #重新输出变量的特点之一就是变量值可被覆盖,即便将变量值修改得和原有值毫不相关,也是可以的。
接下来,在现有基础上我们继续针对变量 moto 增加值,使用变量叠加的方式:
[root@localhost ~]# echo $moto FF-GSX #首先输出当前变量 moto 均值 [root@localhost ~]# moto=$moto-RC #使用变量叠加的方式对变量 moto 的值进行重新赋值 [root@localhost ~]# echo $moto FF-GSX-RC #在原有值的基础上加入-RC所谓变量叠加,就是在原有值的基础上增加变量值,因此先使用 $moto 来调用原有值,然后将需要增加的值写在 $moto 之后。
但是在变量叠加时需要注意调用变量值的格式。如果出现在变量名后的第一个字符是字母或数字,那么通常不能准确地调用变量值,例如:
[root@localhost ~]# name1=1 #变量名为 name1,变量值为 1 [root@localhost ~]# name1=a${name1}b2c3 #使用变量叠加的方式对变量 name1 进行赋值,出现在$name1后的第一个字符是字母 b [root@localhost ~]# echo $name1 a #变量叠加赋值后变量 name1 的值是字母 a变量叠加后,在我们的设想中变量 name1 的值应该是 a1b2c3,但是结果是变量值变为字母 a,原因在于变量叠加过程中需要调用变量 name1 的原有值。但在上面的叠加格式中,系统将 $name1b2c3 识别为一个整体,调用 $name1b2c3 的值进行变量叠加赋值。我们之前没有设置过 $name1b2c3 的值,因此经过调用,$name1b2c3 的调用结果为空,只剩字母 a 对变量 name1 重新进行了一次赋值。
我们之所以能够成功对变量 moto 进行变量叠加,是因为 shell 变量名中只能包含字母、数字,以及下画线。而变量 name1 在变量叠加时加入的字符是 -RC,也就是说跟在变量名 moto 后的第一个字符是“-”。因此,系统认为“-”之前的字符串是一个独立的变量名,“-”及后续字符串是需要变量叠加的内容。
任何空白字符或标点符号(下画线除外)都足以提示变量名的结束位置,但如果变量名后是数字或字母,就需要加入大括号“{}”来表示变量名。加入大括号后,执行结果如下:
[root@localhost ~]# name1=1 #再次对 name1 进行赋值 [root@localhost ~]# name1=a${name1}b2c3 #使用大括号的方式将变量名包含在内 [root@localhost ~]# echo $name1 a1b2c3 #成功调用变量 name1 的值并进行了变量叠加在使用大括号时,写在双引号或大括号内的变量名会被识别为一个整体,这就避免了变量名和后续需要叠加的值混在一起而不能正常识别的情况出现。
Linux自定义变量的查看
我们可以通过 echo 命令查询已经设定的变量值,这种查询需要事先知道变量名,然后才能查询变量值。但是,如果不知道变量名,怎样查询系统中有哪些存在的变量呢?只需使用 set 命令即可。set 命令可以用来查看系统中的大多数变量(包括用户自定义变量和两种环境变量,不包括预定义变量和位置参数变量)和设定 shell 的执行环境,其格式如下:
[root@localhost ~]# set [选项]选项:
- -u: 如果设定此选项,那么在调用未声明的变量时会报错(默认无任何提示);
- -x: 如果设定此选项,那么在命令执行之前会先把命令输出一次。
set 命令执行结果如下:
[root@localhost ~]# set #set 命令在不添加任何选项执行时,会列出当前除预定义变量与位置参数变量外的所有变量 BASH=/bin/bash #BASH 完整路径和文件名 BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extquote:force_fignore:globasciiranges:histappend:histcomplete:interactive_comments:progcomp:promptvars:sourcepath #当前 shell 选项参数,可使用 shopt 命令进行修改,修改后可增加易用性 BASHRCSOURCED=Y #/etc/bashrc 文件是否已经生效,Y 表示文件存在且文件经过 source 生效于当前 shell。如果/etc/bashrc文件不生效,那么此选项不存在 ...省略部分输出... moto=FF-GSX-RC #之前练习过程中的自定义变量
set -u 选项主要用于区分未声明变量和赋值为空的变量,在默认情况下,如果不开启 set -u 选项,那么调用一个未声明变量的返回结果,与调用变量值为空的结果相同。在执行过 set -u 选项后,就可以轻易区分出变量值为空和变量未声明的情况,具体如下:
[root@localhost ~]# set | grep test1 #通过 set 与 grep 的结合使用并没有找到变量 test1 进行赋值的证明 [root@localhost ~]# echo $test1 #变量 test1 没有进行过赋值,即变量并不存在,输出结果为空 [root@localhost ~]# test2="" #变量 test2 赋值为空 [root@localhost ~]# set | grep test2 test2= #通过 set 与 grep 的结合使用能够找到变量 test2 的赋值 [root@localhost ~]# echo "$test2" #变量值输出为空,此时如果不查看 set 命令的执行结果,就无法区分变量是没有赋值还是赋值为空 [root@localhost ~]# set -u [root@localhost ~]# echo $test1 -bash: test1: unbound variable #在调用未声明变量时出现提示
接下来是执行 set 命令中的 -x 选项:
[root@localhost ~]# set -x #如果设定了-x 选项,就会在每条命令执行之前先把命令输出一次,包括命令别名等内容 ++ printf '033[0;%s@%s:%s\007' root localhost '~' [root@localhost ~]# #在输出结果中不仅可以看到ls命令的执行结果,还会出现ls命令别名等内容set 命令的选项和功能众多,不过我们较常用的还是使用 set 命令查看变量是否存在。
Linux自定义变量的删除
如果想要删除自定义变量,就可以使用 unset 命令,其格式如下:[root@localhost ~]# unset 变量名
因为是清空变量,而不是调用变量值,所以在变量名前不需要加入“$”符号。举例说明:
[root@localhost ~]# unset moto #删除变量 moto在删除变量后,可通过 set 命令确认变量删除效果。同时需要注意,用户自定义变量只会在当前 shell 中生效。
即便是同一个用户在不同终端登录,也无法调用相同用户在不同终端声明的用户自定义变量。同时,因为变量声明占用的是内存空间,所以如果只在命令行中声明自定义变量,就会造成系统重启,最终导致变量被清除。