摘要: 这个脚本是一个叫做wrappers脚本的完整类的示例。wrappers的基础思想是它们处于一个真实的Unix命令和用户之间,它在对真实的单个命令不可用的情况下,会给用户提供不同的、有效的功能。在这个脚本中,在不通知用户的情况下,用rm命令删除文件的操作实际上会被写入一个单独的log文件。(这段话真难理解,只有看到了wrappers的时候,或许才能理解。这个脚本的目的很简单,就是使用rm命令来删除文件时可以用本脚本文件作为一个替代,在使用本脚本时,如果不使用-s选项,则会记录这个删除操作到一个文本文件中。)代码: 1 #!/bin/sh 2 3 # logrm.sh -- 记录所有的文件删除.. 阅读全文
posted @ 2012-12-19 15:32 十舍七匹狼 阅读(149) 评论(0) 推荐(0)
摘要: 既然有了一个被删除文件的目录,而且这个目录是在用户的家目录下的隐藏目录,那么一个让用户检索这些已删除文件的脚本的程序就会非常有用了。不管怎样,想要表明所有可能发生的情况是很难的,因为它包括了没有匹配、仅有一个匹配以及多个匹配三种情况。在多个匹配的情形中,比如,你是想要挑出最新的文件,然后将它还原?还是指明有多少种情况匹配成功,然后就退出?又或是展示下不同情况的数据然后供用户挑选?下面,让我们来看看我们到底都能做些什么...代码: 1 #!/bin/sh 2 3 # unrm.sh -- 查找已删除文档中的给定文件或是目录 4 # 如果有多个匹配,那么给出一个按时间戳排序的结果列表,... 阅读全文
posted @ 2012-12-18 14:53 十舍七匹狼 阅读(145) 评论(0) 推荐(0)
摘要: 以过往的经验来看,Unix用户最常见的一个问题是无法恢复意外删除的文件和目录。键入 rm xyz 之后,一旦你按下RETURN键,那么一切都是浮云了。这个问题的一个解决方案是秘密的、自动的存档文件和目录。想象一下,这个脚本中的基本工作可以做的让用户毫无察觉。代码: 1 #!/bin/sh 2 3 # newrm.sh, 一个rm命令的替代品, 4 # 通过在用户的家目录下建立并利用一个新目录,提供了一个非删除的能力 5 # 它可以处理目录,也可以处理独立的文件, 6 # 如果用户提供了-f 选项,那么删除时就不会存档 7 8 # 重要警告:如果你要自动完成删除垃圾目录的工作,那么不要使用... 阅读全文
posted @ 2012-12-14 15:05 十舍七匹狼 阅读(158) 评论(0) 推荐(0)
摘要: 如果你运气不错,你的Unix系统中已经含有了fmt命令(man下试试),它是一个对于处理文本很有用的命令。从重格式化Email到在文档中填充段落(即保证每一行上要有足够多的的词)。fmt命令对于这些都很有用。但部分Unix系统并没有包含fmt命令,特别是大学里面捐赠的系统,它们一般只有很简陋的版本。最终,我们可以在一个小脚本中使用nroff命令来达到相同的效果。nroff命令是从Unix系统诞生以来就有的一个命令。代码: 1 #!/bin/sh 2 3 # fmt的一个使用norff命令的版本。增加2个有用的选项: 4 # 行宽度:-w X 5 # 启用连字符:-h 6 7 whil... 阅读全文
posted @ 2012-12-14 10:06 十舍七匹狼 阅读(136) 评论(0) 推荐(0)
摘要: 虽然这节并不包含一个真实的脚本,但是在此谈谈开发和调试shell脚本的基础是很有益处的。因为,bug是一定会出现的。我发现的最好的调试策略就是渐增性的生成脚本。一部分脚本程序员对于首次运行即会OK保持着高度乐观的态度,但我发现由小处开始,在一个适宜的规模上的,会很有用处。此外,自由使用echo语句来追踪变量,以及-x选项来显示调试输出,都是很有用的。为了看看它们是怎么做的,我们来调试一个简单的猜数字游戏。代码: 1 #!/bin/sh 2 # hilow -- A simple number-guessing game 3 4 biggest=100 ... 阅读全文
posted @ 2012-12-13 13:04 十舍七匹狼 阅读(1020) 评论(0) 推荐(0)
摘要: 第一章中的很多脚本是用函数的形式写的,而不是独立脚本,这样做的目的就是可以在别的脚本中使用它们而不用进行系统调用。shell脚本中并没有像C一样的#include特性,不过它有一个很重要的能力叫做souring a file,有同样的效果。想搞明白这个为什么重要,那么我们来思考下。如果你在shell中调用一个shell脚本,默认情况下调用的脚本是在自己的子shell中运行。你可以马上通过测试证明这点:cat tinyscript.sh # 脚本中只有一行 test=2test=2 # 打屏test=1 # 现在键入这行tinyscript.s... 阅读全文
posted @ 2012-12-12 16:04 十舍七匹狼 阅读(155) 评论(0) 推荐(0)
摘要: 尽管你可能还没有意识到,可你的标准终端应用是能够支持不同的文本风格。大量不同的风格是可能的,不管你是想要在你的脚本中让特定的词使用粗体,还是在一个黄色背景下使用红色字体。使用ANSI(美国国家标准化组织)序列来表现这些不同风格是有难度的,因为这些序列对于用户而言并不是很友好的。因此,这个脚本部分生成了一系列的变量来表示ANSI码,这样就可以用它们来决定是否使用不同的颜色和格式。代码:#!/bin/sh# ANSIColor.sh -- 使用下面的变量表示不同的颜色# 和格式。以f结尾的词表示文本颜色。# 以b结尾的词表示背景色。initializeANSI(){ esc="\033& 阅读全文
posted @ 2012-12-12 11:52 十舍七匹狼 阅读(143) 评论(0) 推荐(0)
摘要: 任何脚本,在对共享数据文件,比如日志文件,进行读或追加写操作时,都需要一个可信赖的方法来确保别的脚本进程不会同时更新它。解决问题的思路就是使用一个独立的锁文件,就好像信号一样。它的存在表明了有一个不同的文件正在使用该数据文件,所以此时该数据文件不能被其它人使用。请求文件会等待,然后继续尝试请求使用该数据文件,希望数据文件会被快速释放掉,而判断的关键标志就在于锁文件是否被移除了。但是锁文件的运行很复杂,许多看起来万无一失的情况都有可能失败。比如下面的例子就是一个解决这个问题的典型方法:1 while [ -f $lockfile ]; do2 sleep 13 done4 touch ... 阅读全文
posted @ 2012-12-11 18:10 十舍七匹狼 阅读(198) 评论(0) 推荐(0)
摘要: 在脚本的编写过程中,最常用的恐怕就是$(())了。它可以执行多种基本算术运算。这个表达式非常有用,特别是增加计数器时;并且它支持+ - * / %运算,不过不是所有的整数和小数都行。比如,下面的命令返回的是0,而不是0.5:echo $((1/2)) 所以当一个计算结果需要更高的精度时,这也就意味着你接受了一个挑战。在命令行下没有几个好用的计算程序。除了,比如说,bc,一个很少有Unix用户学习的怪异程序。bc程序会把自己当作一个任意精度的计算器,它使用隐晦的错误信息追溯到Unix的开头,并且完全没有提示,而且,一旦你使用它,它就假定你已经非常明了你正在做什么。但这一切都没有关系,我们可以搞. 阅读全文
posted @ 2012-12-10 17:19 十舍七匹狼 阅读(660) 评论(0) 推荐(0)
摘要: 大部分流行的Unix和Linux版本都有一个echo命令。它包含有-n选项来禁止换行,但并不是所有的版本都一样。其中一些版本的echo命令使用\c作为一个特殊的嵌入字符来禁止换行,还有一些则必须换行后才能输出。想要搞明白你自己的echo版本是什么样的,非常简单:只需要在命令行上键入下面的语句即可:echo -n "The rain in Spain";echo " falls mainly on the Plain"如果你的echo有-n选项,会有:The rain in Spain falls mainly on the Plain如果没有,那么则是另 阅读全文
posted @ 2012-12-10 11:51 十舍七匹狼 阅读(927) 评论(0) 推荐(1)