linux bash学习-变量的操作

变量的操作

  变量就是以一组文字或者符号来替代一些设置或者一串保留的数据,通常环境变量设置为大写。

1、变量的设置

直接使用=即可进行变量的设置,使用echo ${name} 或者echo $namelai 来查看已经设置好的变量。

 

变量的设置规则:

1、变量与变量内容之间使用=来进行连接,但是等号两边不能有空格。

2、变量名称的首字母不能是数字,只能是字母或者下划线,且不超过255个字符,且默认的类型时字符串类型。

3、变量内容中需要包含其他变量则需要使用双引号“,单纯的字符串使用单引号‘,同时使用`反引号`command`与$(commmand)等价,但是其不与$command等价(实际这条命令就没法运行),这条命令后面仅仅能够接变量,毕竟不需要先执行。当然可以不使用引号,这会使得赋值时,如果变量内容中有空格,则会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(要反引下)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要双引号替代无引号的情况,特别是对变量赋值时改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输输出,不过最好是用。

4、可以使用转义字符”\“将特殊符号($、!,空格与[enter]转化为字符),显示的结果有点怪,依旧包含转义字符

5、如果需要在当前线程的子进程中执行,需要使用export使得该变量成为环境变量(鸟哥也这样说的),但是不等价与全局环境变量,在其他的终端里面并不能使用该变量,也就是本进程和子进程共享配置。

 

6、取消变量名字的方法为使用unset 变量的名字,如使用"unset aaa"

2、环境变量的查询

 使用env来查询当前的环境变量也可以使用set查询(含有环境变量与自定义变量),set 显示当前shell的变量同时还将显示bash的变量

                                        

测试添加一个新的变量aaa=yao,将本进程的使用set的输出进行重定向set >set.txt 2>&1,在set.txt中可以看到aaa,同样在另一个用户中使用set >set_other.txt 2>&1,在set_other.txt中没有aaa变量

使用env测试,直接输入env,看不到aaa,因为aaa是当前shell的变量,但是使用export aaa后使用env就可以在本shell窗口看到aaa了,说明aaa是当前的用户变量了。

 

 

 综上,使用set 变量相当于export 变量 ,在该shell的进程以及该shell的子进程都可以共享该环境变量的设置,具体体现在某个用户都可以使用,但是不使用set或者export,则该环境变量仅仅在本shell下有效。set与export仅仅当前用户有效,原因是子线程会继承父线程的环境变量,但是不会继承父线程的自定义变量。但是在子进程中设置的shell变量经过export或者set后在父进程中时无法查询的,即无效,注意一旦使用bash 进入子进程的话,父线程就进入休眠.

也就是说:
set 显示当前shell的变量,包括当前用户的变量(bash 变量和export、set)

env 显示当前用户环境变量(仅仅属于当前用户的变量,除去bash)

export 显示(设置)当前导出成用户环境变量的shell变量(不包括shell的变量,与env一样,但是比env多了一个类型信息)

因此 set=env/export+shell的局部变量+bash的部分局部变量

在set中记录有一个PS1的参数,但是在env中看不到,说明这是个bash的内置非环境变量。使用echo 可以看到,描述了命令提示符的格式

 

常见的可设置的内容为:

\d:显示星期月日

\u :显示本账户信息

\v:显示bash 版本

\w:显示完整的工作路径

\W:显示目录的最后一项路径

 \#执行的第几个命令

\$:提示符,root用户显示#,非root用户显示$

\h:取主机名小数点第一个小数点前的名字

 

可以看到其必须要使用引号,不使用引号会出现问题。。。。,注意,这些提示符的修改同样是临时生效的,一旦注销或重启系统就会消失。要想永久生效,必须写入环境变量配置文件。这也对于系统有好处。

在变量的设置的时候提到使用转义字符时?也在其中,?在bash中有其特殊的含义,?表示是上个命令的执行状态,在我的机器上上个命令执行成功返回0,不成功返回127

对于在set 中可以看到PS1参数但是在env/export看不到的原因是因为PS1不是环境变量,例如我先更改了PS1后使用子进程看PS1就发现更改无效

但是经过export后就发现可以在env/export中找到了

 

3、变量的键盘读取、数组与声明

3.1 read 

read 用于读取键盘的内容赋予一个变量格式为 read [-pt] variable

-p :后面可以接提示符

-t :后面可以接等待的秒数,超时失效

3.2 declare/typeset

declare与typeset都是用于申明变量的具体格式为 declare [-aixr] variable

-a :数组

-i :integer

-x: export 为环境变量

-r :将变量设为readonly 类该变量不可更改,也不能重设。

在bash中如果不要申明sum为integer则结果为一个字符串,也说明了declare具备一定的推理能力

 

可以使用+来取消以及申明的选项,取消了就不是全局变量了,不明显,再来试试

 4、变量内容的删除与替换

       在已经存在变量后需要对来进行更改与删除,因此使用#和%进行删除,使用/进行替代(在vim中使用:line 1,line2 s/string1/string2/g或者使用r(替换模式)),在下面使用#进行从前到后进行匹配查询,具体是将所有的字符当做一个长串,进行该长串的子串与删除的目标串匹配,一旦字串与目标串匹配,即删除字串,如下:

/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/yaoqinchuan/.local/bin:/home/yaoqinchuan/bin是变量长串,*/.local/bin是需要匹配的目标,那么长串的/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/yaoqinchuan/.local/bin能够完美匹配*/.local/bin(切记要将这个视为字符串字串匹配问题)第三幅图很典型。

  使用##则不在第一个匹配位置进行删除,他会查找到最后一个匹配的为位置,删除该位置之前所有的内容,包括该字符,也就是所谓的最长串。

    使用%同样会进行删除操作,但是其使用后向搜索,即从后向前搜索,同样的道理,第一次输错了%输成了#,规则和#一样,不做赘述。

 

    使用//string1/string2将整个串中的字符进行替换  

 

  除了使用//也可以使用-来进行替换,只不过相对于//,-替换的意义在于检查改变量先是否已经被使用,如果没有被使用则进行赋值但是如果被赋值为空字串的变量无法使用,使用:-进行空串赋值检查。

  相应的使用+号会进行相反的检查,即串非空时候进行替代。

总结以上的操作:

 5、语系的设置

在centos 7中可以使用locale进行当前所使用语系的查询,如图当前所使用的语言为zh_CN.UTF-8,可以通过设置LANG进行语言的改变

                  

在bash的子进程中修改的变量依旧是生效的

也可以通过修改/etc/sysconfig/i18n来进行LANG的开机生效,但是在Centos 7中没有这个文件,取而代之的是/etc/locale.conf。

 6、位置参数变量

posted @ 2018-11-18 18:45  提康德罗加F  阅读(518)  评论(0)    收藏  举报