下载第18章编写shell命令脚本程序如果你需要下列问题的一个快速解决方案请查阅节号编写一个命令脚本程序18.
2.
1给变量赋值18.
2.
2使用某个变量的值18.
2.
3提示和接受输入数据18.
2.
4忽略元字符18.
2.
5编写条件if语句18.
2.
6接受命令行输入18.
2.
7添加注释语句18.
2.
8添加一个帮助组件18.
2.
9添加一个for循环语句18.
2.
10添加一个while循环语句18.
2.
11添加一个菜单18.
2.
12二次检查用户输入数据18.
2.
13比较文件、字符串以及规则表达式18.
2.
14结束一个命令脚本程序18.
2.
15测试一个命令脚本程序18.
2.
16调试一个命令脚本程序18.
2.
1718.
1概述shell命令脚本程序是一种极其有用的系统管理工具.
它可以用来自动完成通常在命令行上执行的重复或者复杂的工作.
对那些并不很了解Linux操作系统的用户来说,命令脚本程序还可以用来自动完成一些基本的任务,或者用来完成一些只有对Linux操作系统有着深厚功底的人才能采用其他方法完成的任务.
18.
1.
1shell概述shell是用户与Linux操作系统内核之间的接口.
它是用户工作在其中的环境,而用户可以选择使用哪一种shell来进行工作,每一种shell都各有特色,因而吸引了有着不同个人需要的人,帮助他们完成工作.
每一种shell对用户输入的命令进行处理时,还要使用它自己的语法、环境变量等等:bashshell是Linux操作系统的缺省shell,也是根帐户最经常使用的shell.
Cshell之所以得到这么个名字是因为它的语法很像编程用的C语言;因此它在使用C语言的程序员中很流行.
Linux操作系统中的Kornshell实际上并不是标准的Kornshell,前者只是后者的一个名为pdksh(PublicDomainKornShell)的公共域版本.
它包括了一些Cshell中的特色,又加上了一些新的特色,这就使它成为大量编写shell命令脚本程序的人们的首选.
它在RedHat和Caldera发行版本的CD-ROM光盘中都有相应的软件包.
208Linux安装与配置简明手册下载相关解决方案请查阅节号挂装到文件系统上9.
2.
2安装一个RPM软件包15.
2.
118.
1.
2良好的命令脚本程序编程习惯对于命令脚本程序的编写工作来说,并没有什么放之四海而皆准的指导原则,下面列出的是一些应该具备的良好编程习惯:基于文件和路径管理两方面的考虑,把全部的shell命令脚本程序统一保存到某个固定位置的做法是非常明智的.
不论是为超级用户还是为普通用户编写命令脚本程序,这一条都是适用的.
许多人会在他们的用户目录中建立一个名为bin(~/bin)的目录.
但上面这个做法需要注意的是:如果系统管理员为一部分用户或者全部用户编写了命令脚本程序,就要考虑应该把这些命令脚本程序存放到什么位置,其原则也就是为某个程序选择存放位置所必须考虑的因素.
不要过分相信自己的记忆力,认为能够记住所编写的命令脚本程序的功能与实现方法的每一个细节.
如果需要在几个月或几年后对命令脚本程序进行修改或升级的话,最好还是尽可能在程序中加上好的注释.
使用缩进格式排列命令脚本程序里的条件语句,这样就可以很清楚地看出哪个命令属于哪个子句.
在18.
2.
6节中给出了一个这类格式的例子.
18.
1.
3编程示范下面我们将通过一个简单的示范程序带领你走过编写命令脚本程序的全过程.
在这些步骤的介绍中,还包括了在计划和编写shell命令脚本程序时容易忽略的因素.
不必担心,编写命令脚本程序实现起来并不难.
1.
命令脚本程序的功能这个命令脚本程序的基本功能是对一个Web主机上的某个Web文件进行大量、相同的修改.
因为这个例子中的管理员没有足够的时间来编写一个复杂的命令脚本程序,所以这个例子本身也就只能够完成全部修改工作中最初始的部分.
这个命令脚本程序可以在今后逐步加以改进,使它能够完成更大和更复杂的任务—比如对一组被选中的目录中的每一个文件进行修改等等.
2.
准备编写命令脚本程序可能很多人都会认为立刻开始编写命令脚本程序是最有效率的.
但是在现实情况中,先进行一些计划准备工作将会使程序的编写工作进展得更顺利.
要不然,就会因为又发现还需要考虑某些其他方面而不得不回过头去重复修改以前的程序.
下面是编写这个命令脚本程序需要的几个步骤:1)首先,决定把命令脚本程序解释器运行在哪一种shell环境下.
因为这个例子是准备编写一个系统监管性质的命令脚本程序,缺省的shell又是bash,所以我们就沿用bashshell好了.
2)在开始编程之前,首先需要确定在命令行提示符完成这个工作通常都会用到哪些命令.
在这个例子中,第一个目标是搜索与替换一个Web页上面的某个URL地址;最终的目标是建立一个能够完成更多功能的程序集合.
我们选择使用sed命令来完成这个搜索与替换操作.
第18章编写shell命令脚本程序209下载3)请仔细阅读sed命令的使用手册页和其他有关文档.
事实上,就是不使用命令脚本程序的方法,sed命令也可以完成这个任务;编写命令脚本程序的目的就是使够更简单轻松地执行同样或者类似任务,而不必再去学习如何掌握sed命令复杂的语法.
4)引起大家注意的第一个问题就是必须使用一个分隔符来把搜索与替换的两个短语分隔开.
缺省的分隔符是正斜杠(/).
但是,搜索与替换的两个短语都是URL地址,因此它们自己本身就将带有斜杠字符.
这个问题我们有两种方法可以解决:使用转义字符(escapecharacter)—即反斜杠(\)—来转换正斜杠字符.
转义字符序列会通知解释器程序,该序列中的字符应该按照它显示的样子而非一个特殊字符(比如分隔符)来对待.
举例来说,要想查找URL地址"www.
green.
org/lime",需要输入下面的搜索短语:www.
green.
org\/lime\/在本章的例子中,我们将选用上面的方法,因为这是程序接受正规表达式所使用的标准格式.
使用完全不同的一个分隔符.
并不是只有正斜杠符号才能被用做分隔符.
举例来说,因为在搜索与替换短语中不会使用到URL地址中的"http://"部分,所以冒号(:)也可以用来作为分隔符.
窍门"元字符(meta-character)"是那些给出关于其他字符信息的字符.
它们是"特殊的字符";用到它们的时候一般都是为了特殊的目的,不会是按照它们本身的样子被使用的.
举例来说,正斜杠(/)在sed命令中通常就被当做是一个元字符,因为它是用来分开命令中不同组成部分的.
5)现在,写出sed命令的语句.
我们打算搜索并替换的是URL地址"www.
peach.
org";打算把它替换为"http://watermelon.
com/pink".
因为第一个部分—即"hppt://"—不需要改变,整个语句应该是下面的样子:s/www\.
peach\.
org\//watermelon\.
com\/pink\//语句中各部分的意义如下所示:s/—告诉sed命令这个语句执行的是替换操作.
www\.
peach\.
org\//—就是我们查找的文本.
之所以会有这么多的转换字符(\),是因为句号(.
)和URL地址中的正斜杠(/)符号都必须被转换.
请注意在语句的最后还有一个正斜杠符号,它表示sed命令的搜索短语到此结束.
watermelon\.
com\/pink\/—是我们想用来替换原文的文字内容.
语句中最后的一个斜杠表示sed命令到此结束.
3.
建立命令脚本程序文件要想建立这个命令脚本程序,首先需要我们打开并编辑一个文本文件:1)输入"mkdir~/bin"命令,在用户目录中建立一个bin目录.
2)输入"cd~/bin"命令,把路径切换到bin目录.
3)输入"PATH=$PATH:~/bin"命令,把bin目录添加到path路径中去.
4)使用喜欢的文本编辑器程序打开这个文件.
如果使用的是vi编辑器的话,可以输入"viwebchange".
4.
编写命令脚本程序到这里我们就已经把命令和语法都确定下来了,现在开始编写命令脚本程序的内容:210Linux安装与配置简明手册下载1)每个shell命令脚本程序的第一行都是一个解释器声明语句.
对这个命令脚本程序来说,它的解释器是bashshell.
所以webchange文件的第一行内容就是:#!
/bin/bash从此往下,在命令脚本程序中添加的任何内容都将提交给bashshell的解释器.
2)因为建立这个命令脚本程序的最初目的只是完成一个任务,但最终的目的是把它的用途扩展到更普遍的情况,所以千万不要忘记在学习sed命令时掌握的知识.
请使用井字号(#)打头,在命令脚本程序中加上注释语句.
注意如果在命令脚本程序中某一行的开头用了"#!
"字符,shell命令会认为这是在定义一个用来运行命令脚本程序的程序.
这个命令脚本程序的一个注释例子如下所示:#SedstatementbuilttosearchforthefirstURLand#replaceitwiththe#second.
Noticetheescape#charactersensuringthattheperiodsandfront#slashesareseenasactualcharactersandnotmeta-characters.
3)接下来,是sed命令的语句本身:seds/www\.
peach\.
org\//watermelon\.
com\/pink\//test.
html我们先不要冒险去真的修改某个Web文件,把这个Web文件拷贝到一个临时测试文件中(本例子中这个文件就是test.
html),这样就可以在使用这个命令脚本程序处理重要的数据之前,确认它不会造成什么无法预见的问题.
4)保存文件并退出.
5)使用类似于"chmod+xwebchange"这样的命令修改文件的存取权限,使它成为一个可执行文件.
5.
测试命令脚本程序现在来测试命令脚本程序,确认它可以正常执行.
如果:已经在path语句中加上了这个命令脚本程序的目录名.
已经在~/bin目录中拷贝或者建立了一个测试文件.
已经使用类似于"chmod+xwebchange"这样的命令把这个命令脚本程序设置为一个可执行文件.
那么,就可以输入这个文件的文件名"webchange",对它进行测试.
18.
2快速解决方案18.
2.
1编写一个命令脚本程序编写一个shell命令脚本程序需要经过以下几个基本步骤:1)从编辑包含用户的命令脚本程序的文本文件开始.
2)添加shell定义语句,这样Linux操作系统就可以知道用户使用的是哪一种shell语言.
3)编写shell命令脚本程序4)保存命令脚本程序并退出.
第18章编写shell命令脚本程序211下载5)使用"chmod+xwebchange"命令改变这个命令脚本程序的存取权限和所有权限,使它可以被适当的用户帐户执行使用.
6)运用这个命令脚本程序测试它.
7)如有必要可进行程序纠错,然后返回第6步.
8)如有必要可把完整的命令脚本程序移动到它该去的位置.
9)如有必要可在path语句中加上它的路径.
18.
2.
2给变量赋值你可以直接给变量分配一个值,也可以让变量等于某个命令的输出结果.
具体如何给变量赋值主要取决于准备分配给变量的值来自什么地方.
1.
直接赋值请按照下面的格式直接给变量赋一个值:variable=value请记住,如果想在某个数据值使用巨字符,就必须转换或者忽略它们(请阅读18.
2.
5节中的内容).
另外,如果使用了包含空格字符的字符串,就必须把它们放在双引号("")中,如下所示:name1="Smith,Adam"2.
通过命令给变量赋值如果想让变量等于某个命令的输出结果,需要把命令放在单引号('')中,格式如下所示:variable='command'举例来说,使用:now='date'把变量now的值设置为date命令的输出结果,也就是当前的日期和时间.
18.
2.
3使用某个变量的值如果想使用某个变量的值,按照下面的格式输入这个变量:$variable18.
2.
4提示和接受输入数据在命令脚本程序中你可以提示用户输入不要的信息.
先使用echo命令(请阅读18.
2.
17节中的内容)显示提示信息.
然后按照下面的格式使用read命令:readvariable_nameread命令告诉命令脚本程序暂停执行,等待用户的输入;用户按下回车键结束输入后命令脚本程序继续向下执行.
18.
2.
5忽略元字符下面是一个元字符清单.
如果你想把它们用作普通字符(比如说在echo语句中)就需要用一个反斜杠对它们进行转换:212Linux安装与配置简明手册下载其他使元字符普通化的方法还有:用单引号('')把元字符或者包含了元字符的字符串括起来.
如下所示:echo'-->CutHereandsend$8withApplicationCutHereandsend\$8withApplication按照字母表顺序,后一个字符串比是否前一个字符串靠前吗表18-6test命令的算术比较参数比较参数比较情况01-eq表达式相等吗是否-ne表达式相等吗否是-lt哪一个表达式比较小第一个第二个-gt哪一个表达式比较大第一个第二个-le第一个表达式小于或者是否等于第二个表达式吗-ge第一个表达式大于或者是否等于第二个表达式吗18.
2.
15结束一个命令脚本程序在一个命令脚本程序文件的末尾并没有什么特殊的记号或者代码可用.
当shell执行到命令脚本程序的末尾或者出现错误的情况时,它就会自动退出,并且把最后一个命令的执行结果作为程序出口状态值.
如果想了解基本程序出口状态值更详细的资料,请阅读18.
2.
16节中的内容.
下面给出一个例子:218Linux安装与配置简明手册下载第18章编写shell命令脚本程序219下载在上面的例子中,语句的then部分有一个明确定义的程序出口状态值,却没有定义明确的else出口状态值.
但是由于整个语句中没有出现错误,它的程序出口状态值将是0.
18.
2.
16测试一个命令脚本程序在测试一个命令脚本程序的时候,请注意下面几个问题:除非一个命令脚本程序经过了完全的测试,否则不要对有效文件(也就是那些重要的和系统上正在使用的文件)进行修改或者保存所做的修改.
可以把修改保存到临时文件或者使用一个测试文件来执行命令脚本程序.
逐步测试命令脚本程序是很明智的做法.
在命令脚本程序中增加一个新的功能,然后立即测试命令脚本程序.
然后增加另外一个新功能,再进行测试.
与一次性编写一个长长的命令脚本程序并把它作为一个大的整体进行测试相比,这个方法可以比较容易找出问题出现的原因.
18.
2.
17调试一个命令脚本程序本小节给出了一些在进行命令脚本程序调试的时候需要遵守的基本做法.
这些做法可以把一个也许混乱不清的调试过程变成比较平静的搜索和缩小问题潜在原因的过程.
diyvm怎么样?diyvm是一家国内成立时间比较久的主机商家了,大约在6年前站长曾经用过他家的美国机房的套餐,非常稳定,适合做站,目前商家正在针对香港沙田机房的VPS进行促销,给的是五折优惠,续费同价,香港沙田机房走的是CN2直连的线路,到大陆地区的速度非常好,DiyVM商家采用小带宽不限流量的形式,带宽2Mbps起步,做站完全够用,有需要的朋友可以入手。diyvm优惠码:五折优惠码:OFF50...
今天看到群里的老秦同学在布局自己的网站项目,这个同学还是比较奇怪的,他就喜欢用这些奇怪的域名。比如前几天看到有用.in域名,个人网站他用的.me域名不奇怪,这个还是常见的。今天看到他在做的一个范文网站的域名,居然用的是 .asia 后缀。问到其理由,是有不错好记的前缀。这里简单的搜索到.ASIA域名的新注册价格是有促销的,大约35元首年左右,续费大约是80元左右,这个成本算的话,比COM域名还贵。...
SugarHosts糖果主机商我们较早的站长们肯定是熟悉的,早年是提供虚拟主机起家的,如今一直还在提供虚拟主机,后来也有增加云服务器、独立服务器等。数据中心涵盖美国、德国、香港等。我们要知道大部分的海外主机商都只提供Linux系统云服务器。今天,糖果主机有新增SugarHosts夏季六折的优惠,以及新品Windows云服务器/云VPS上线。SugarHosts Windows系统云服务器有区分限制...