首页 > 代码库 > 第十三章、学习 Shell Scripts

第十三章、学习 Shell Scripts

什么是 Shell scripts

shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』

shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字档,将一些 shell 的语法与命令(含外部命令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。

shell script 就像是早期 DOS 年代的批量档 (.bat) ,最简单的功能就是将许多命令汇整写在一起, 让使用者很轻易的就能够 以one touch 的方法去处理复杂的动作 (运行一个文件 "shell script" ,就能够一次运行多个命令)。

shell script 可以被看成是批量档, 也可以被说成是一个程序语言,且这个程序语言由於都是利用 shell 与相关工具命令, 所以不需要编译即可运行,且拥有不错的除错 (debug) 工具。


干嘛学习 shell scripts

 

  • 自动化管理的重要依据:

    管理一部主机每天要进行的任务就有: 查询登录档、追踪流量、监控使用者使用主机状态、主机各项硬件设备状态、 主机软件升级查询。工作方式可以分为: (1)自行手动处理,或是 (2)写个简单的程序来帮你每日自动处理分析

  • 追踪与管理系统的重要工作:

      Linux 系统的服务 (services) 启动脚本在 /etc/init.d/ 目录下,目录下的所有文件都是 scripts ; 另外,包括启动 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相关配置数据, 然后再代入各个服务的配置参数!举例来说,如果我们想要重新启动系统登录档, 可以使用:『/etc/init.d/syslogd restart』,那个 syslogd 文件就是 script!

    另外,鸟哥曾经在某一代的 Fedora 上面发现,启动 MySQL 这个数据库服务时,确实是可以启动的, 但是萤幕上却老是出现『failure』!后来才发现,原来是启动 MySQL 那个 script 会主动的以『空的密码』去尝试登陆 MySQL ,但为了安全性鸟哥修改过 MySQL 的密码, 后来改了改 script ,就解决了这个问题!

  • 简单入侵侦测功能:

    当我们的系统有异状时,大多会将这些异状记录在系统记录器,也就是我们常提到的『系统登录档』, 那么我们可以在固定的几分钟内主动的去分析系统登录档,若察觉有问题,就立刻通报管理员, 或者是立刻加强防火墙的配置守则,如此一来,你的主机可就能够达到『自我保护』。 举例来说,我们可以通过 shell script 去完成『当该封包尝试几次还是连线失败之后,就予以抵挡住该 IP』,例如鸟哥写过一个关於抵挡砍站软件的 shell script!

  • 连续命令单一化:

    『仅是帮我们把一大串的命令汇整在一个文件里面, 而直接运行该文件就可以运行那一串又臭又长的命令段!』

  • 简易的数据处理:

      awk 可以用来处理简单的数据!例如薪资单的处理等等的。如鸟哥曾经用 shell script 直接处理数据数据的比对啊, 文字数据的处理等等的

  • 跨平台支持与学习历程较短:

    几乎所有的 Unix Like 上面都可以跑 shell script ,连 MS Windows 系列也有相关的 script 模拟器可以用, 此外, shell script 的语法是相当亲和的

 

shell script 处理数据的速度是不快。因为 shell script 用的是外部的命令与 bash shell 的一些默认工具,所以,他常常会去呼叫外部的函式库,因此,运算速度上面比不上传统程序语言。 shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shell scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。


第一支 script 的撰写与运行

shell script是纯文字档

注意事项:

  1. 命令的运行是从上而下、从左而右的分析与运行;
  2. 命令的下达: 命令、选项与参数间的多个空白都会被忽略掉;
  3. 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键;
  4. 如果读取到一个 Enter 符号 (CR) ,就尝试开始运行该行 (或该串) 命令;
  5. 如果一行的内容太多,则可以使用『 \[Enter] 』来延伸至下一行;
  6. 『 # 』可做为注解!任何加在 # 后面的数据将全部被视为注解文字而被忽略!

在 script 内所撰写的程序会被一行一行的运行。现在我们假设你写的这个程序档名是 /home/dmtsai/shell.sh 好了,如何运行:

  • 直接命令下达: shell.sh 文件必须要具备可读与可运行 (rx) 的权限,然后:
    • 绝对路径:使用 /home/dmtsai/shell.sh 来下达命令;
    • 相对路径:假设工作目录在 /home/dmtsai/ ,则使用 ./shell.sh 来运行
    • 变量『PATH』功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/
  • 以 bash 程序来运行:透过『 bash shell.sh 』或『 sh shell.sh 』来运行

 

/bin/sh 是 /bin/bash (连结档),使用 sh shell.sh 亦即告诉系统,直接以 bash 的功能来运行 shell.sh 这个文件内的相关命令,所以此时 shell.sh 只要有 r 的权限即可被运行!也可以利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确


  • 撰写第一支 script

 

[root@www ~]# mkdir scripts; cd scripts[root@www scripts]# vi sh01.sh#!/bin/bash# Program:#       This program shows "Hello World!" in your screen.# History:# 2005/08/23	VBird	First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHecho -e "Hello World! \a \n"exit 0

 

  1. 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称:
    因为我们使用的是 bash ,所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用 bash 的语法!那么当这个程序被运行时,他就能够加载 bash 的相关环境配置档 (一般来说就是 non-login shell 的 ~/.bashrc), 并且运行 bash 来使我们底下的命令能够运行!(在很多状况中,如果没有配置好这一行, 那么该程序很可能会无法运行,因为系统可能无法判断该程序需要使用什么 shell 来运行!)

  2. 程序内容的说明:
    整个 script 当中,除了第一行的『 #! 』是用来宣告 shell 的之外,其他的 # 都是『注解』用途! 所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说, 建议你一定要养成说明该 script 的:1. 内容与功能; 2. 版本资讯; 3. 作者与联络方式; 4. 建档日期;5. 历史纪录 等等。这将有助於未来程序的改写与 debug!

  3. 主要环境变量的宣告:
    建议务必要将一些重要的环境变量配置好,鸟哥个人认为, PATH 与 LANG (如果有使用到输出相关资讯时) 是当中最重要的! 如此一来,则可让我们这支程序在进行时,可以直接下达一些外部命令,而不必写绝对路径呢!

  4. 主要程序部分
    就将主要的程序写好即可!在这个例子当中,就是 echo 那一行啦!

  5. 运行成果告知 (定义回传值)
    一个命令的运行成功与否,可以使用 $? 这个变量来观察,可以利用 exit 这个命令来让程序中断,并且回传一个数值给系统。 在我们这个例子当中,鸟哥使用 exit 0 ,这代表离开 script 并且回传一个 0 给系统, 所以我运行完这个 script 后,若接著下达 echo $? 则可得到 0 的值!

 

[root@www scripts]# sh sh01.shHello World !

另外,你也可以利用:『chmod a+x sh01.sh; ./sh01.sh』来运行这个 script !


撰写 shell script 的良好习惯创建

 

  • script 的功能;
  • script 的版本资讯;
  • script 的作者与联络方式;
  • script 的版权宣告方式;
  • script 的 History (历史纪录);
  • script 内较特殊的命令,使用『绝对路径』的方式来下达;
  • script 运行时需要的环境变量预先宣告与配置。

 


 

第十三章、学习 Shell Scripts