shell脚本基础知识-什么是shell、环境变量

日常的linux系统管理工作中必不可少的就是shell脚本,对于测试工程师来说,掌握shell脚本的编写能力也是给自己加分的重要技能。

一、什么是shell

        shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。 说到底,Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell。

       Shell是解释执行的脚本语言,所谓脚本语言就是不用编译就可以直接执行的语言。在Shell中可以调用Linux系统命令。    

       bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。

bash的特点:

1)记录命令历史

我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。注意,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。

与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个用法:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!10”表示执行命令历史中第10个命令;(3)!字符串(字符串大于等于1),例如!ls,表示执行命令历史中最近一次以ls为开头的指令。

2)指令和文件名补全

按tab键,它可以补全一个指令,也可以补全一个路径或者一个文件名。连续按两次tab键,系统则会把所有的指令或者文件名都列出来。补全路径时,如果该路径下只有一个文件or目录,直接点tab键就能补全,如果有多个的话需要输入能区分文件or目录的开头。如目录下有autotest 和test文件夹,我们要进入test,则直接输入t然后按tab键即可补全test。

3)别名

alias是bash所特有的功能之一,通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。如果不想用了,还可以用unalias解除别名功能。直接敲alias会看到目前系统预设的alias :

以上是系统预设的alias指令,你也可以自定义你想要的指令别名。alias语法很简单,alias [命令别名]=[’具体的命令’]。

以下为给vim加别名和解除别名的截图

4)通配符

在bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符。

5)输入输出重定向

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。

输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>,稍后会详细介绍。

以下为输出重定向的举例,见截图

6)管道符

管道符”|”,就是把前面的命令运行的结果丢给后面的命令。

7)作业控制

当运行一个进程时,你可以使它暂停(按Ctrl+z),恢复(按fg),后台运行(按bg),终止(按Ctrl+c)。

 

二、环境变量【PATH】

环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的。变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可。你可以使用echo命令显示变量的值,见下图。

另外,使用env命令可全部列出系统预设的全部系统变量。不过登录的用户不一样这些环境变量的值也不一样。下图显示的是我的账户的环境变量。

以下为常见的环境变量:

PATH 决定了shell将到哪些目录中寻找命令或程序

HOME 当前用户主目录

HISTSIZE 历史记录数

LOGNAME 当前用户的登录名

HOSTNAME 指主机的名称

SHELL 前用户Shell类型

LANG 语言相关的环境变量,多语言可以修改此环境变量

MAIL 当前用户的邮件存放目录

PWD 当前目录

env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。这里不单独截图了,有兴趣的话可以自己试一下。

set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。如下图,用户可以自定义变量。

自定义变量只能在当前shell中生效,见下图,使用bash命令再打开一个新的shell,再次打印之前设置的test变量,发现已经不存在然后再操作退出新的shell回到原来的shell,test变量还在。

但是我们也能设置变量一直生效,包括两种情况:

1、变量供所有用户使用

需要在/etc/profile文件最末行加入 “export test=autotest” 然后运行”source /etc/profile”就可以生效了。此时你再运行bash命令或者切换账户看看。

2、变量仅供当前用户使用

需要在用户主目录下的.bashrc文件最后一行加入“export test=autotest” 然后运行”source .bashrc”就可以生效了。这时候再登录另一个账户,test变量则不会生效了。

注意:linux下设置自定义变量也有一些规则:

1)设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;

2)变量名只能由英、数字以及下划线组成,而且不能以数字开头;

3)当变量内容带有特殊字符(如空格)时,需要加上单引号;

当变量内容中带有单引号时,需要用到双引号

4)如果变量内容中需要用到其他命令运行结果则可以使用反引号;

5)变量内容可以累加其他变量的内容,需要加双引号;累加其他变量时如果为单引号则得出的结果非预期结果。

从上面的例子可看出,单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。

在前面的例子中笔者多次使用了bash命令,如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell了,不妨你用pstree指令来查看一下。

pstree这个指令会把linux系统中所有进程通过树形结构打印出来,你可以直接输入pstree查看即可。在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令。

export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量a的值是123.如果export后面不加任何变量名,则它会声明所有的变量。

在最后面连同我们自定义的变量都被声明了,见上图最后一行。

如果要取消某个变量,只要输入“unset 变量名”即可。用unset a后,再echo $a则不再输出任何内容。

 

三、配置系统环境变量与个人环境变量

1、系统环境变量:

/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等。

/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如笔者的linux系统PS1就是 [yan***[email protected]****.com ~]$ ,你不妨看一下PS1的值。

\u就是用户,\H 主机名, \W 则是当前目录,\$就是那个’#’(管理员显示为‘#’)了,如果是普通用户则显示为’$’(我是普通用户所以显示为‘$’)

2、除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:

.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。

.bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如:将用户自定义的alias或者自定义变量写到这个文件中

.bash_history :记录命令历史用的。

.bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。