项目导入
如果想要管理好主机,一定要好好学习shell script。Shell script有点像是早期的批处理,即将一些命令汇总起来一次运行。但是shell script拥有更强大的功能,那就是它可以进行类似程序(program)的撰写,并且不需要经过编译(compile)就能够运行,非常方便。同时,我们还可以通过 shell script 来简化日常的工作管理。在整个Linux的环境中,一些服务(service)的启动都是通过 shell script 来运行的,如果对于script不了解,一旦发生问题,可真是会求助无门啊!
初识 shell script
- 了解 shell script
什么是 shell script(程序化脚本)呢?就字面上的意义,我们将其分为两部分。在“shell”部分,我们在项目7中已经提过了,那是在命令行界面下让我们与系统沟通的一个工具接口。那么“script”是什么?字面上的意义,script 是“脚本、剧本”的意思。整句话是说,shell scnipt是针对shell 所写的“脚本”。
其实,shell scipt是利用 shell的功能所写的一个“程序(program)”。这个程序使用纯文本文件,将一些 shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到所想要的处理目的。
所以,简单地说,shell script就像是早期DOS年代的批处理(.bat),最简单的功能就是将许多命令写在一起,让使用者很轻易地就能够处理复杂的操作(运行一个文件“shell script”,就能够一次运行多个命令)。shell scnipt能提供数组、循环、条件与逻辑判断等重要功能,让用户也可以直接以 shell来撰写程序,而不必使用类似C程序语言等传统程序撰写的语法。
shell script可以被简单地看成是批处理文件,也可以被说成是一个程序语言,并且这个程序语言都是利用shell与相关工具命令组成的,所以不需要编译即可运行。另外,shell scrim还具有不错的排错(debug)工具、所以,它可以帮助系统管理员快速地管理好主机。
2.编写与执行一个 shell script
2.1在 shell script撰写中的注意事项
•命令的执行是从上而下、从左而右进行的。
•命令、选项与参数间的多个空格都会被忽略掉。
•空白行也将被忽略掉,并且按“Tab”键所生成的空白同样被视为空格键。
•如果读取到一个Enter 符号(CR),就尝试开始运行该行(或该串)命令。
•如果一行的内容太多,则可以使用“[Enter]”来延伸至下一行。
•“#”可作为注解。任何加在#后面的数据将全部被视为注解文字而被忽略。
2.2 运行 shell script 程序
现在假设程序文件名是 /home/dmtsai/shell.sh,那如何运行这个文件呢?很简单,可以有下面几个方法。
(1)直接命令下达:shell.sh文件必须要具备可读与可运行(rx)的权限。
绝对路径:使用/home/dmtsai/shell.sh来下达命令。
相对路径:假设工作目录在/home/dmtsai/,则使用/shell.sh来运行。
• 变量“PATH”功能:将 shell.sh 放在 PATH 指定的目录内,如~/bin/。(2)以bash程序来运行:通过“bash shell.sh”或“sh shell.sh”来运行。
由于linux默认使用者家目录下的~/bin目录会被设置到SPATH内,所以也可以将shell.sh创建在/home/dmtsai/bin/下面(~/bin日录需要自行设置)。此时,若shell.sh在~/bin内且具有rx 的权限,直接输人shell.sh即可运行该脚本程序。
为何“sh shell.sh”也可以运行呢?这是因为/bin/sh其实就是/bin/bash(连结档),使用sb shell.sh 即告诉系统,我想要直接以bash的功能来运行 shell.sh这个文件内的相关命令,所以此时 shell.sh只要有r的权限即可被运行。也可以利用 sh的参数,如利用-n及-x来检查与追踪shell.sh的语法是否正确。
3. 编写第一个 shell script 程序
rooc@CentOS7-1 -]# cd; mkdir scripts; cd scripts
[root@RUEL7-1 ~]# vim sh01.sh
#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
#History:
# 2022/11/03 Devil First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0
在本项目中,请将所有撰写的scnpt放置到家目录的-/scrnpts这个目录内,以利于管理。
下面分析上面的程序。
(1)第一行#!/bin/bash在宣告这个scnpt使用的shell名称。
因为我们使用的是bash,所以必须要以“I/bin/bash”来宜告这个文件内的语法使用bat的语法。那么当这个程序被运行时,就能够加载 bash的相关环境配置文件(一般来说就是non-login shell的/.bashre)、并且运行bash来使我们下面的命令能够运行,这很重要。在很多情况下,如果没有设置好这一行,那么该程序很可能会无法运行,因为系统可能无法判断该程序需要使用什么shell来运行。
(2)程序内容的说明。
整个 script当中,除了第一行的“削”是用来声明shell的之外,其他的#都是“注释”用途。所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。
建议:一定要养成说明该 scripl的内容与功能、版本信息、作者与联络方式、建立日期、历史记录等习惯。这将有助于未来程序的改写与调试。
(3)主要环境变量的声明。
务必将一些重要的环境变量设置好,其中PATH与LANG(如果使用与输出相关的信息时)是最重要的。如此一来,可让这个程序在运行时直接执行一些外部命令,而不必写绝对路径。
(4)主要程序部分。
在这个例子中,主要程序部分就是echo那一行。
(5)运行成果告知(定义回传值)。
一个命令的运行成功与否,可以使用S?这个变量来查看。也可以利用exit这个命令来让程序中断,并且回传一个数值给系统。在这个例子中,使用exit 0,这代表离开 script并且回传一个0给系统,所以当运行完这个 script后,若接着执行 echo $?,则可得到0的值。聪明的读者应该也知道了,利用这个exitn(n是数字)的功能,还可以自定义错误信息,让这个程序变得更加智能。
该程序的运行结果如下:
[root@CentOS7-1 scripts]# sh sh01.sh
Hello world!
同时,运行上述程序应该还会听到“咚”的一声,为什么呢?这是因为echo加上了-e选项。当你完成这个小 script之后,是不是感觉写脚本程序很简单?
另外,你也可以利用“chmod a+x sh01.sh; /sh01.sh”来运行这个script。
- 养成撰写 shell script的良好习惯
养成良好习惯是很重要的,但大家在刚开始撰写程序的时候,最容易忽略这部分,认为程序写出来就好了,其他的不重要。其实,如果程序的说明能够更清楚,对自己是有很大帮助的。
建议一定要养成良好的senpt撰写习惯,在每个script的文件头处包含如下内容。
·scnpt的功能
·oscript的版本信意
·scnpt的作者与联络方式
·script的版权声明方式
·script的 History(历史记录)。
·script内较特殊的命令,使用“绝对路径”的方式来执行。
·script运行时需要的环境变量预先声明与设置。
除了记录这些信息之外,在较为特殊的程序部分,建议务必加上注解说明。此外,程序的撰写建议使用嵌套方式,最好能以“Tab”键的空格缩排。这样程序会显得非常漂亮、有条理,可以很轻松地阅读与调试程序。另外,撰写script的工具最好使用vim而不是vi,因为vim有额外的语法检验机制,能够在第一阶段撰写时就发现语法方面的问题。