Linux Shell编程从初学到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 第一个Shell脚本例子

1.3.1 Shell脚本的基本元素

使用Shell脚本的最初动机可能在于省去手动输入命令的麻烦,Shell脚本将一系列的Linux命令放在一个文件中,这样,我们就不必每次都手动输入同样的命令。比如:当一个用户登录系统后,他每次都是先执行.bash_profile文件配置命令行环境,再查看当前有哪些用户在登录,那么,这个用户将会依次输入以下命令完成上述操作:

. .bash_profile
date
who

显然,用户每次输入重复的命令显得比较麻烦,我们能否把多个命令写入一个文件,然后通过执行这个文件来执行这些命令呢?这就是最原始的Shell脚本。上述的三条命令可以写入下面的文件中,该文件取名为whologged.sh:

#!/bin/bash
cd                              #切换到用户根目录,因为.bash_profile在根目录下
. .bash_profile                 #配置用户的命令行环境
date                            #显示日期命令
who                             #显示当前的登录用户

whologged.sh文件就是一个典型的Shell脚本。需要注意的是,whologged.sh文件的第1行是“#!/bin/bash”,“#!”符号称为“Sha-bang”符号,是Shell脚本的起始符号,“#!”符号是指定一个文件类型的特殊标记,它告诉Linux系统这个文件的执行需要指定一个解释器。“#!”符号之后是一个路径名,这个路径名指明了解释器在系统中的位置,对于一般的Shell脚本而言,解释器是bash,也可以是sh,即用下面的两种方式作为脚本的第1行都是正确的:

#!/bin/bash
#!/bin/sh

当然,Linux还存在其他的一些解释器,如sed和awk等,指定这些解释器就需要对第1行做相应的改动。本书第4章将会介绍sed和awk,在此,请读者记住大部分脚本都是用bash解释器的,但是,其他解释器依然是存在的。

“#!/bin/bash”行之后,whologged.sh文件按顺序写入需要执行的三条命令,每条命令后面有一段以“#”符号起始的中文,“#”符号是注释符,它后面直到本行结束的所有内容是注释,脚本执行时是不执行注释的,“#”符号类似于C++和Java语言中的“//”符号,脚本注释可以是整行,也可以在某行的后面:

command    #在行后面的注释
#整行的注释

注释能增加Shell脚本的可读性,便于人们理解该脚本。因此,读者在编写脚本时,应养成勤加注释的好习惯。

从whologged.sh脚本也可以看出,命令(command)是Shell脚本的最基本元素,命令通常由命令名称、选项和参数三部分组成,三部分之间用空格键或Tab键分隔。我们以下面的例1-1来说明命令的三个组成部分。

#例1-1:介绍Linux命令的组成部分
[root@jselab ~]# ls -l /etc/sh*                           #一条简单的Linux命令
-r--------. 1 root root 11812009-09-04 /etc/shadow
-r--------. 1 root root 11812009-09-04 /etc/shadow-
-rw-r--r--. 1 root root   322009-04-10 /etc/shells
[root@jselab ~]#

例1-1中的命令用于列出/etc目录下以“sh”开头文件的详细信息,这一条简单的Linux命令就由三个部分组成,“ls”是命令名称,“-l”是选项,“/etc/sh*”是参数。命令名称在命令中是不可或缺的,而选项和参数则可以不出现。选项的开头符号是一个减号(-),后面跟一个或多个字母,选项是对命令的补充说明,读者在学习Linux命令时需要在辨析和理解选项上花力气,读者在后续章节的学习中一定能够体会到选项的重要性。参数可以理解为命令的作用对象,“/etc/sh*”参数中“*”符号称为通配符,通配符经常在命令参数中出现。我们将在第3章详细讨论通配符的用法。

Linux系统有成千上万条命令,我们很难全部掌握这些命令,而且即便是经常使用的命令,我们往往也会忘记这些命令的选项和用法,此时可利用Linux系统提供的命令的手册页(manual page),我们可以用如下格式的命令打开某命令的手册页:

man [命令名称]

man命令可以打开其他Linux命令的手册页,手册页上能详细地显示命令名称、基本格式、对选项的详细描述等信息,man是Linux程序员和管理员用于查询命令用法的常用手段。

分号(;)可以用来隔开同一行内的多条命令,Shell会依次执行用分号隔开的多条命令,例1-2演示了分号的用法。

#例1-2:分号的用法
[root@jselab ~]# ls -l /etc/sh*;date;who                  #同一行内有三条命令,用分号隔开
-r--------. 1 root root 11812009-09-04 /etc/shadow      #ls命令的结果
-r--------. 1 root root 11812009-09-04 /etc/shadow-
-rw-r--r--. 1 root root   322009-04-10 /etc/shells
2010年 03月 23日 星期二 12:33:25 CST                       #date命令的结果
root    pts/0       2010-03-23 11:42 (210.28.82.132)     #who命令的结果
root    pts/1       2010-03-23 11:43 (210.28.82.199)
[root@jselab ~]#

例1-2的同一行内有三条命令,用分号隔开,依次显示了这三条命令的执行结果。

本节给出了第一个Shell脚本,Shell脚本以“#!”符号开头,该符号后面跟了解释器的路径;命令是Shell脚本的最基本元素,它定义了Shell脚本的动作,包含命令名称、选项和参数三个部分;Shell脚本中也可以添加注释,以注释符“#”引出。除此之外,Shell脚本还可以包含变量、各种控制结构,以及算术和逻辑运算符,这些内容将在后续章节中展开。

1.3.2 执行Shell脚本

在编写好一个Shell脚本后,如何执行这个Shell脚本呢?这与Linux系统对文件的管理有关,Linux系统管理文件结合考虑了用户权限和文件权限,本书第2 章将详细介绍Linux系统用户管理和文件管理的基础知识,简言之,要执行一个Shell脚本,只需要使当前用户具备执行该脚本文件的权限。一般来说,当我们用文本编辑器创建一个Shell脚本文件时,该文件是没有可执行权限的,即x权限。因此,我们需要先赋给Shell脚本可执行权限,再去执行它。下面的例1-3给出了whologged.sh脚本的执行过程。

#例1-3:执行whologged.sh脚本
[root@jselab shell-book]# chmod u+x whologged.sh     #为whologged.sh脚本赋可执行权限
[root@jselab shell-book]# ls -l whologged.sh         #查看whologged.sh的权限
-rwxr--r--. 1 root root 155 03-23 13:14 whologged.sh  #具备x权限了
[root@jselab shell-book]# ./whologged.sh             #执行whologged.sh脚本
2010年 03月 23日 星期二 13:14:35 CST                   #whologged.sh脚本的执行结果
root    pts/0       2010-03-23 11:42 (210.28.82.132)
root    pts/1       2010-03-23 11:43 (210.28.82.199)
[root@jselab shell-book]#

例1-3首先利用chmod命令为whologged.sh脚本赋可执行权限,chmod命令将在第2章详细介绍,查看whologged.sh的权限时发现,whologged.sh文件确实具备了x权限,即whologged.sh文件具备了可执行权限。最后,使用./[脚本名]格式的命令执行whologged.sh脚本,Shell打印出whologged.sh脚本的执行结果。

缺乏Linux文件管理基础知识的读者可能并不理解Shell脚本执行的原因,这类读者可以通过阅读本书第2章掌握Linux用户管理、文件管理和文本编辑器,掌握第2章内容之后,一定能轻松地掌握Shell脚本的执行。