shell script脚本编程


linux系统自动化管理工具: Shell scripts! 基本上, shell script有点像是早期的批处理文件,将一些指令汇整起来一次执行, 但是Shell script拥有更强大的功能,那就是他可以进行类似程序(program)的编写,并且不需要经过编译(compile)就能够执行。 shell script可以简化日常的工作管理, 整个Linux系统的管理包括一些服务(services)的启动都可以通过shell script完成。

12.1 什么是Shell scripts
shell script顾名思义就是由shell执行的脚本。
shell script是利用shell的功能编写的一个程序(program),这个程序使用纯文本文件, 将一些shell的语法与指令(含外部指令)写在里面, 搭配正则表达式、管道命令与数据流重导向等功能,以达到特定的处理目的。
shell script就像是早期DOS年代的批处理文件(.bat),最简单的功能就是将许多指令汇整写在一起, 让用户很轻易的就能够one touch的方法去处理复杂的动作(执行一个文件 "shell script",就能够一次执行多个指令)。
shell script还提供数组、循环、条件与逻辑判断等重要功能,让用户也可以直接以shell来编写程序,而不必使用类似C程序语言等传统程序编写的语法!
shell script可以简单的被看成是批处理文件, 也可以被说成是一个程序语言,这个程序语言利用shell与相关工具指令,不需要编译即可执行, 且拥有不错的调试(debug)工具,可以帮助系统管理员快速的管理好主机。

12.1.1 shell scripts的功能
自动化管理的重要依据
管理一部主机真不是件简单的事情,每天要进行的任务就有:查询登录文件、追踪流量、监控用户使用主机状态、主机各项硬件设备状态、主机软件更新查询等等。 这些工作可以分为: (1)手动处理,或是(2)写个简单的程序来自动处理分析。第二种方法就得要良好的shell script来帮忙啦!
追踪与管理系统的重要工作
CentOS 6.x以前的版本中,系统服务(services)启动的接口是在/etc/init.d/目录下,目录下的所有文件都是scripts。 另外,开机(booting)过程也都是利用shell script来查询系统的相关设置, 然后再代入各个服务的设定参数! 举例来说,如果我们想要重新启动系统日志服务, 可以使用:
/etc/init.d/rsyslogd restart
rsyslogd文件就是script!
虽然/etc/init.d/*脚本启动的方式(systemV)已经被新的systemd所取代(从CentOS 7开始), 但是很多服务在管理服务启动方面,还是使用shell script!
简单入侵检测功能
当系统有异常时,大多会将这些异常记录在系统日志文件中, 我们可以在固定的几分钟内主动的去分析系统日志文件, 若察觉有问题,就立刻通报管理员, 或者是立刻加强防火墙的设定规则。 举例来说,我们可以通过shell script去分析当该封包尝试几次还是联机失败之后,就予以抵挡住该IP之类的举动,例如写过一个关于抵挡砍站软件的shell script
连续指令单一化
script最简单的功能就是集合一些在command line下运行的连续指令,写入scripts当中,而由直接执行scripts来启动一连串的command line指令输入! 例如:防火墙连续规则(iptables),开机加载程序的项目(就是在/etc/rc.d/rc.local里头的数据) ,等等都是相似的功能啦!
简易的数据处理
awk可以用来处理简单的数据!shell script的功能更强大,例如曾经用shell script直接处理数据数据的比对啊, 文字数据的处理啊等等的
举例来说,每学期都得要以学生的学号来建立他们能够操作Linux的系统账号,然后每个账号还得要能够有磁盘容量的限制(quota)以及相关的设定等等, 那因为学校的校务系统提供的数据都是一整串学生信息,并没有单纯的学号字段,所以就得要透过前几章的方法搭配shell script来自动处理相关设定流程, 这样才不会每学期都头疼一次啊!
跨平台支持与学习历程较短
几乎所有的Unix Like上面都可以跑shell script,shell script的语法是相当亲和的,看都看的懂得文字(虽然是英文),很容易学习。
上面这些都是shell script的特点,shell script可以简单的以vim来直接编写。
虽然shell script号称是程序(program) ,实际上,shell script处理数据的速度上是不太够的。
因为shell script用的是外部的指令与bash shell的一些默认工具,所以,他常常会去呼叫外部的函式库, 因此,指令周期上面当然比不上传统的程序语言。 shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了, 因为Shell scripts 的速度较慢,且使用的CPU资源较多,造成主机资源的分配不良。
通常利用 shell script 来处理服务器的侦测,倒是没有进行大量运算的需求啊!

12.1.2 第一支script的编写与执行
shell script是纯文本文件,我们可以编辑这个文件,然后让这个文件来帮我们一次执行多个指令,或者是利用一些运算与逻辑判断来帮我们达成某些功能。
下面的脚本程序输出"Hello World!",然后退出:

              [peter@study ~]$ mkdir bin; cd bin
              [peter@study bin]$ vim hello.sh
              #!/bin/bash
              # Program:
              # This program shows "Hello World!" in your screen.
              # History: 2015/07/16 INITroot 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
            
将编写的script文件放到家目录的~/bin目录内!
上面的脚本程序主要包含如下内容:
1.第一行是必须的,#!/bin/bash声明这个script的执行使用的shell程序文件名。
我们使用的是bash,#!/bin/bash声明这个文件由bash执行! 脚本被执行时,就会加载bash的相关环境配置文件(一般来说就是non-login shell的~/.bashrc), 并且使用bash执行脚本中的指令!
2.除了第一行的#!是用来声明shell之外,其他的#都是注释! 一般来说, 建议脚本开头的注释包含如下的内容:1.内容与功能;2.版本信息;3.作者与联络方式; 4.文件创建日期;5.历史纪录等等。这将有助于未来程序的编辑与debug!
3.主要环境变量的声明:
建议将一些重要的环境变量设定好,PATH与LANG(如果有使用到输出相关的信息时)是当中最重要的! 这样脚本在进行时可以直接执行外部指令,而不必写绝对路径,比较方便!
4.主体程序部分
在这个例子当中,就是echo那一行!
5.退出并传递返回值
可以使用$?变量来观察上一个指令的执行成功与否,我们也可以利用exit这个指令来让程序中断,并且返回一个数值给系统。 使用exit 0代表离开script并且返回0给系统,所以执行完script后,执行echo $?就会得到0!
利用exit n (n 是数字)的功能,我们还可以自定义错误讯息,让这支程序变得更加智能!
查看程序的执行结果:
              [peter@study bin]$ sh hello.sh
              Hello World !
            
应该还会听到咚的一声
另外,也可以利用:chmod a+x hello.sh; ./hello.sh来执行这个script!
在shell script的编写中还需要用到底下的注意事项:
1. 指令的执行是从上而下、从左而右的分析与执行;
2. 指令的下达就如同第四章内提到的: 指令、选项与参数间的多个空白都会被忽略掉;
3. 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空格键;
4. 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令;
5. 至于如果一行的内容太多,则可以使用 \[Enter] 来延伸至下一行;
6. #可做为批注!任何加在#后面的资料将全部被视为批注文字而被忽略!
有一下几种方法可以执行一个shell脚本文件:
直接指令下达: shell.sh 文件必须要具备可读与可执行 (rx) 的权限,然后:
o 绝对路径:使用 /home/peter/shell.sh 来下达指令;
o 相对路径:假设工作目录在 /home/peter/ ,则使用 ./shell.sh 来执行
o 变量PATH功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/
o 以bash程序来执行:透过 bash shell.sh 或 sh shell.sh 来执行反正重点就是要让那个 shell.sh 内的指令可以被执行的意思啦! 咦! CentOS默认用户家目录下的~/bin目录会被设定到${PATH}内,所以也可以将shell.sh建立在/home/peter/bin/目录下( ~/bin目录需要自行设定) 。 若shell.sh在 ~/bin内且具有rx的权限,那就直接输入shell.sh即可执行该脚本程序!
那为何 sh shell.sh 也可以执行呢?这是因为 /bin/sh 其实就是 /bin/bash (连结档), 使用sh shell.sh亦即告诉系统,我想要直接以bash的功能来执行shell.sh这个文件内的相关指令的意思, 所以此时你的shell.sh只要有r的权限即可被执行!而我们也可以利用sh的参数,如-n及-x来检查与追踪shell.sh的语法是否正确!

主机 IP 的侦测啊、 登录档分析与管理啊、自动上传下载重要配置文件啊等等的,
在写程序的时候,最好将程序的设计思路记录下来,在每次修改脚本的时候,最好在脚本开头加上修改记录。
另外,每部主机的环境可能都是不一样的,为了获取较佳的执行环境, 最好在脚本之前就将用到的环境变量定义好,例如PATH环境变量! 总之,在编写shell script的时候,建议你一定要养成良好的编写习惯,通常建议在每个script文件的开头记录如下信息:

script的功能;
script的版本信息;
script的作者与联络方式;
script的版权声明方式;
script的 History (历史纪录);
script内较特殊的指令,使用绝对路径的方式来下达;
script运作时需要的环境变量预先声明与设定。
除了记录这些信息之外,在较为特殊的程序代码部分,建议务必要加上注释说明。
程序代码的排版结构清晰,通过tab按键对代码适当的缩进,以显示程序的逻辑层次结构。
关于编写script的工具就有很多了,任何一个文本编辑器都可以,最好使用vim而不是vi,因为vim会有额外的语法检查机制,能够快速发现语法错误!

相关阅读:
initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读