参考:

http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be

http://www.runoob.com/linux/linux-tutorial.html

12.1 什么是 Shell scripts

什么是 shell script (程序化脚本) 呢?就字面上的意义,我们将他分为两部份。 在“ shell
”部分,我们在 十章的 BASH 当中已经提过了,那是一个命令行下面让我们与系统沟通的一个
工具接口。那么“ script ”是啥? 字面上的意义, script 是“脚本、剧本”的意思。整句话是说,
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

这是个好问题:“我又干嘛一定要学 shell script ?我又不是信息人,没有写程序的概念, 那我
干嘛还要学 shell script 呢?不要学可不可以啊?”呵呵~如果 Linux 对你而言, 你只是想
要“会用”而已,那么,不需要学 shell script 也还无所谓,这部分先给他跳过去, 等到有空的
时候,再来好好的瞧一瞧。但是,如果你是真的想要玩清楚 Linux 的来龙去脉, 那么 shell
script 就不可不知,为什么呢?因为:
自动化管理的重要依据
不用鸟哥说你也知道,管理一部主机真不是件简单的事情,每天要进行的任务就有:查询登
录文件、追踪流量、监控使用者使用主机状态、主机各项硬件设备状态、 主机软件更新查
询、更不要说得应付其他使用者的突然要求了。而这些工作的进行可以分为: (1)自行手动
处理,或是 (2)写个简单的程序来帮你每日“自动处理分析”这两种方式,你觉得哪种方式比
较好? 当然是让系统自动工作比较好,对吧!呵呵~这就得要良好的 shell script 来帮忙的
啦!
追踪与管理系统的重要工作

12.1 什么是 Shell scripts

虽然我们还没有提到服务启动的方法,不过,这里可以先提一下,我们 CentOS 6.x 以前的版
本中,系统的服务 (services) 启动的接口是在 /etc/init.d/ 这个目录下,目录下的所有文件
都是 scripts ; 另外,包括开机 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相
关设置数据, 然后再代入各个服务的设置参数啊!举例来说,如果我们想要重新启动系统登
录文件, 可以使用:“/etc/init.d/rsyslogd restart”,那个 rsyslogd 文件就是 script 啦!
另外,鸟哥曾经在某一代的 Fedora 上面发现,启动 MySQL 这个数据库服务时,确实是可以
启动的, 但是屏幕上却老是出现“failure”!后来才发现,原来是启动 MySQL 那个 script 会主
动的以“空的密码”去尝试登陆 MySQL ,但为了安全性鸟哥修改过 MySQL 的密码?~当然就
登陆失败~ 后来改了改 script ,就略去这个问题啦!如此说来, 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
里头的数据) ,等等都是相似的功能啦! 其实,说穿了,如果不考虑 program 的部分,那么
scripts 也可以想成“仅是帮我们把一大串的指令汇整在一个文件里面, 而直接执行该文件就可
以执行那一串又臭又长的指令段!”就是这么简单啦!
简易的数据处理
由前一章正则表达式的 awk 程序说明中, 你可以发现, awk 可以用来处理简单的数据数据
呢!例如薪资单的处理啊等等的。 shell script 的功能更强大,例如鸟哥曾经用 shell script 直
接处理数据数据的比对啊, 文字数据的处理啊等等的,撰写方便,速度又快(因为在 Linux
性能较佳),真的是很不错用的啦!
举例来说,鸟哥每学期都得要以学生的学号来创建他们能够操作 Linux 的系统帐号,然后每
个帐号还得要能够有磁盘容量的限制 (quota) 以及相关的设置等等, 那因为学校的校务系
统提供的数据都是一整串学生信息,并没有单纯的学号字段,所以鸟哥就得要通过前几章的

12.1 什么是 Shell scripts

方法搭配 shell script 来自动处理相关设置流程, 这样才不会每学期都头疼一次啊!
跨平台支持与学习历程较短
几乎所有的 Unix Like 上面都可以跑 shell script ,连 MS Windows 系列也有相关的 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 其实就是纯文本文件,我们可以编辑这个文件,然后让这个文
件来帮我们一次执行多个指令, 或者是利用一些运算与逻辑判断来帮我们达成某些功能。所
以啦,要编辑这个文件的内容时,当然就需要具备有 bash 指令下达的相关认识。下达指令需
要注意的事项在第四章的开始下达指令小节内已经提过,有疑问请自行回去翻阅。 在 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 ”来执行
鸟哥的 Linux 私房菜:基础学习篇 第四版
599 12.1 什么是 Shell scripts
反正重点就是要让那个 shell.sh 内的指令可以被执行的意思啦! 咦!那我为何需要使用
“./shell.sh ”来下达指令?忘记了吗?回去第十章内的指令搜寻顺序察看一下, 你就会知道原
因了!同时,由于 CentOS 默认使用者主文件夹下的 ~/bin 目录会被设置到 ${PATH} 内,所
以你也可以将 shell.sh 创建在 /home/dmtsai/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 的语法是否正确呢! ^_^
撰写第一支 script
在武侠世界中,不论是那个门派,要学武功要从扫地与蹲马步做起,那么要学程序呢?呵
呵,肯定是由“秀出 Hello World!” 这个字眼开始的!OK!那么鸟哥就先写一支 script 给大家
瞧一瞧:
[dmtsai@study ~]$ mkdir bin; cd bin
[dmtsai@study bin]$ vim hello.sh
#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2015/07/16 VBird 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 来使我们下面的指令能够执行!这很重要的!(在很多
状况中,如果没有设置好这一行, 那么该程序很可能会无法执行,因为系统可能无法判
断该程序需要使用什么 shell 来执行啊!)
2. 程序内容的说明: 整个 script 当中,除了第一行的“ #! ”是用来宣告 shell 的之外,其他的
# 都是“注解”用途! 所以上面的程序当中,第二行以下就是用来说明整个程序的基本数
据。一般来说, 建议你一定要养成说明该 script 的:1. 内容与功能; 2. 版本信息; 3.
作者与联络方式; 4. 创建日期;5. 历史纪录 等等。这将有助于未来程序的改写与 debug
呢!
3. 主要环境变量的宣告: 建议务必要将一些重要的环境变量设置好,鸟哥个人认为,
PATH 与 LANG (如果有使用到输出相关的信息时) 是当中最重要的! 如此一来,则可
让我们这支程序在进行时,可以直接下达一些外部指令,而不必写绝对路径呢!比较方

12.1 什么是 Shell scripts

便啦!
4. 主要程序部分 就将主要的程序写好即可!在这个例子当中,就是 echo 那一行啦!
5. 执行成果告知 (定义回传值) 是否记得我们在第十章里面要讨论一个指令的执行成功与
否,可以使用 $? 这个变量来观察~ 那么我们也可以利用 exit 这个指令来让程序中断,
并且回传一个数值给系统。 在我们这个例子当中,鸟哥使用 exit 0 ,这代表离开 script
并且回传一个 0 给系统, 所以我执行完这个 script 后,若接着下达 echo $? 则可得到 0
的值喔! 更聪明的读者应该也知道了,呵呵!利用这个 exit n (n 是数字) 的功能,我
们还可以自订错误讯息, 让这支程序变得更加的 smart 呢!
接下来通过刚刚上头介绍的执行方法来执行看看结果吧!
[dmtsai@study bin]$ sh hello.sh
Hello World !
你会看到屏幕是这样,而且应该还会听到“咚”的一声,为什么呢?还记得前一章提到的 printf
吧?用 echo 接着那些特殊的按键也可以发生同样的事情~ 不过, echo 必须要加上 -e 的选
项才行!呵呵!在你写完这个小 script 之后,你就可以大声的说:“我也会写程序了”!哈哈!
很简单有趣吧~ ^_^
另外,你也可以利用:“chmod a+x hello.sh; ./hello.sh”来执行这个 script 的呢!

12.1.3 撰写 shell script 的良好习惯创建

一个良好习惯的养成是很重要的~大家在刚开始撰写程序的时候,最容易忽略这部分, 认为
程序写出来就好了,其他的不重要。其实,如果程序的说明能够更清楚,那么对你自己是有
很大的帮助的。
举例来说,鸟哥自己为了自己的需求,曾经撰写了不少的 script 来帮我进行主机 IP 的侦测
啊、 登录文件分析与管理啊、自动上传下载重要配置文件啊等等的,不过,早期就是因为太
懒了, 管理的主机又太多了,常常同一个程序在不同的主机上面进行更改,到最后,到底哪
一支才是最新的都记不起来, 而且,重点是,我到底是改了哪里?为什么做那样的修改?都
忘的一干二净~真要命~
所以,后来鸟哥在写程序的时候,通常会比较仔细的将程序的设计过程给他记录下来,而且
还会记录一些历史纪录, 如此一来,好多了~至少很容易知道我修改了哪些数据,以及程序
修改的理念与逻辑概念等等, 在维护上面是轻松很多很多的喔!
另外,在一些环境的设置上面,毕竟每个人的环境都不相同,为了取得较佳的执行环境, 我
都会自行先定义好一些一定会被用到的环境变量,例如 PATH 这个玩意儿! 这样比较好啦~
所以说,建议你一定要养成良好的 script 撰写习惯,在每个 script 的文件开始处记录好:
script 的功能;
script 的版本信息;
12.1 什么是 Shell scripts
script 的作者与联络方式;
script 的版权宣告方式;
script 的 History (历史纪录);
script 内较特殊的指令,使用“绝对路径”的方式来下达;
script 运行时需要的环境变量预先宣告与设置。
除了记录这些信息之外,在较为特殊的程序码部分,个人建议务必要加上注解说明,可以帮
助你非常非常多! 此外,程序码的撰写最好使用巢状方式,在包覆的内部程序码最好能以
[tab] 按键的空格向后推, 这样你的程序码会显的非常的漂亮与有条理!在查阅与 debug 上较
为轻松愉快喔! 另外,使用撰写 script 的工具最好使用 vim 而不是 vi ,因为 vim 会有额外的
语法检验机制,能够在第一阶段撰写时就发现语法方面的问题喔!

鸟哥的 Linux 私房菜Shell Scripts篇(一)的更多相关文章

  1. 鸟哥的 Linux 私房菜Shell Scripts篇(四)

    12.4 条件判断式 只要讲到『程式』的话,那么条件判断式,亦即是『 if then 』这种判别式肯定一定要学习的!因为很多时候,我们都必须要依据某些资料来判断程式该如何进行.举例来说,我们在上头的a ...

  2. 鸟哥的 Linux 私房菜Shell Scripts篇(三)

    参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...

  3. 鸟哥的 Linux 私房菜Shell Scripts篇(二)

    参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...

  4. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

  5. 每周一书-《鸟哥的Linux私房菜基础学习篇(第四版)》台湾原版,你想要吗?

     首先说明,本周活动有效时间为2016年10月19日到2016年10月31日.   目在介绍这本书之前,首先要感谢QQ号为:1084830483(路在远方),来自哈尔滨工程大学的同学赠送给玄魂工作室的 ...

  6. 【Linux】鸟哥的Linux私房菜基础学习篇整理(一)

    最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename ...

  7. 《鸟哥的Linux私房菜-基础学习篇(第三版)》(三)

    第2章 Linxu怎样学习         1. Linux当前的应用角色 当前的Linux常见的应用可略分为企业应用和个人应用双方面. 首先谈了企业环境的利用. 1)网络server. 2)关键任务 ...

  8. 鸟哥的Linux私房菜 基础学习篇读书笔记(9):Linux磁盘与文件系统管理(2)

    上一篇文章主要从理论上分析了Linux的Ext2文件系统.这一篇主要解说怎样查看Linux的文件系统的容量以及解说Linux文件系统中的连接文件. 能够通过df和du命令来查看磁盘与文件夹的容量.df ...

  9. 《鸟哥的Linux私房菜-基础学习篇(第三版)》(四)

    第3章 主机规划与磁盘分区        1. Linux与硬件的搭配        首先谈了认识计算机的硬件配置. 然后谈了选择与Linux搭配的主机配置. 在Linuxserver中,内存的重要性 ...

随机推荐

  1. Django--models--多表操作

    一 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关 ...

  2. spring cloud+.net core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  3. NoSuchFieldError

    最近用Fresco框架加载GIF动态图片,遇到一个bug,记录下来,以供后来者少走弯路: 各种百度,最后参照Fresco官方文档,将原有的 fresco:1.3.0替换成0.12.0即: 在APP b ...

  4. 从零开始学 Web 之 jQuery(二)获取和操作元素的属性

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. gbk转utf-8

    1.文件转码:使用脚本   gbk转u8的脚本文件: #!/bin/bash FILE_SUFFIX="java xml html vm js" # FILE_SUFFIX=&qu ...

  6. 团队项目alpha冲刺

    Deadline: 2018-11-18 22:00PM,以博客提交至班级博客时间为准 提交: (a) 项目课堂演示: (b) 7篇冲刺随笔,组内可共享: (c) 1篇测试随笔,组内可共享: (d) ...

  7. Struts2学习(四)———— ognl表达式、值栈、actionContext之间的关系

    一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任意属性,简单说就是对javabean进行操作(重要) 2.调用 ...

  8. Maven教程1(介绍安装和配置)

    官网地址:http://maven.apache.org/ 1.Maven介绍 1.1为什么需要使用Maven 之前学Spring和SpringMVC的时候我们需要单独自己去找相关的jar. 这些ja ...

  9. Jenkins持续集成学习-Windows环境进行.Net开发1

    目录 Jenkins持续集成学习-Windows环境进行.Net开发 目录 前言 目标 使用Jenkins 安装 添加.net环境配置 部署 结语 参考文档 Jenkins持续集成学习-Windows ...

  10. Umbraco 7 特点

    Umbraco 7 features at a glance The backend is mainly built on .NET C# MVC. There are some leftovers ...