随笔分类 -  Wicked Cool Shell Scripts

写写关于Linux下的Shell脚本的心得
摘要:做完了上面的第25、26个脚本后,我们想要自己手动增加一个本地词典,这样就不用在每次遇到一个新的单词后,都会一遍遍的报错了。代码: 1 #!/bin/sh 2 3 # spelldict.sh -- 使用'aspell'特性以及一些过滤以便 4 # 允许命令行拼写检查给定的输入文件 5 6 # 不可避免的,你会发现,有些词汇是错误的,但你认为 7 # 它们是正确的。简单的将它们保存在一个文件中,一次 8 # 一行,并且确定变量'okaywords'指向这个文件。 9 10 okaywords="$HOME/okaywords"11 tempo 阅读全文
posted @ 2013-01-07 10:34 十舍七匹狼 阅读(163) 评论(0) 推荐(0) 编辑
摘要:本脚本用来检查、修复拼写错误。上一个脚本时只能对单个单词检查、修复,而这个脚本的操作对象是一个文件,并且和用户是交互式进行的。代码: 1 #!/bin/sh 2 3 # shpell.sh -- 一个交互式的拼写检查程序 4 # 该程序允许你单步调试文档中所有已知的拼写错误 5 # 原始版本的文件会被另存为一个.shp后缀的文件 6 # 新版本文件会则会替换旧的 7 # 8 # 注意: 你需要一个标准的'spell'命令来完成这些工作, 9 # 这些命令在你的系统上可能是以下之一: aspell, ispell, pspell 10 11 tempfile="/tmp 阅读全文
posted @ 2013-01-06 15:58 十舍七匹狼 阅读(212) 评论(0) 推荐(0) 编辑
摘要:一个检查单词拼写的小程序。非常简单。代码: 1 #!/bin/sh 2 3 spell="ispell -l" 4 5 if [ $# -lt 1 ]; then 6 echo "Usage: `basename $0` word or words" >&2 7 exit 1 8 fi 9 10 for word11 do12 if [ -z $(echo $word | $spell) ]; then13 echo "$word: spelled correctly."14 else15 echo "$wor 阅读全文
posted @ 2013-01-05 10:42 十舍七匹狼 阅读(119) 评论(0) 推荐(0) 编辑
摘要:之前写了第九个脚本,允许命令行调用bc进行浮点计算,所以现在必然要写一个交互式的,基于命令行的计算器封装脚本。它有一个优点:即使加上帮助信息,也很短。代码: 1 #!/bin/sh 2 3 # calc.sh -- 一个看起来像是bc的前端的命令行计算器 4 5 scale=2 6 7 show_help() 8 { 9 cat << EOF10 In addition to standard math function, calc also supports11 12 a % b remainder of a/b13 a ^ b exponential... 阅读全文
posted @ 2013-01-04 11:10 十舍七匹狼 阅读(160) 评论(0) 推荐(0) 编辑
摘要:在Unix命令行上,没有类似于windows或Mac的提示便笺功能,比如方便的记录一个电话号码或是别的什么提示。这个脚本就是解决这个问题的。 第一个脚本,remember.sh 可以让你把任意的小段语句录入到文件中去。如果对该脚本进行无参调用,它就会读入标准输入,如果带有参数,它就会把那些参数保存到文件中去。 第二个脚本remindme.sh,如果无参调用它,它就会显示该便笺的内容,如果带有参数,它就会在便笺中搜索特定内容。代码:运行脚本:先写点内容到便笺.remember中,然后可以搜索下。运行结果: 1 $ remember 2 Enter note, end with ^D: 3 ... 阅读全文
posted @ 2013-01-04 10:24 十舍七匹狼 阅读(79) 评论(0) 推荐(0) 编辑
摘要:一个日期命令最基本的需求就是显示你所在时区的日期和时间。但是如果你有用户是跨时区的呢?或者,如果你有朋友或是同事时在不同的地区呢?你就会一直搞不清楚那儿现在到底是个什么日子了,比如卡萨布兰卡、梵蒂冈或是悉尼。 现在大部分的Unix系统都有一个date命令,它的后台是一个时区数据库。它的位置一般是在目录/usr/share/zoneinfo下,它列出了超过250个不同的地区,并且可以明确表示出各个不同地区的时间。因为date命令注重的是时间变量TZ,该变量可以被设置为不同的已知地区,那么核心的功能可以通过如下表示:TZ="Africa/Casablanca" date 通过一 阅读全文
posted @ 2012-12-27 16:32 十舍七匹狼 阅读(153) 评论(0) 推荐(0) 编辑
摘要:Unix的man命令有一个非常有用的选项,它产生一个手册页的列表,该列表的描述会包括特定单词。通常这个功能用man -k来实现,但它同样也可以通过apropos或是whatis命令实现。 使用man命令来搜索一个词是很有用的,但这只完成了一半,因为一旦你得到了一系列的匹配,你可能仍然会觉得你自己要执行一个强力搜索,一次一个手册页的来查找你所需要的特定命令, 作为一个小巧的备选项,这个脚本生成了一个可能的手册页列表,它匹配一个特定的模式,然后接着就搜索每一个匹配到的手册页来查找第二个模式。为了给输出一点约束,它也允许用户指定要搜索哪个手册页。 小贴士: man手册页是分数字组成的:1 = 用户. 阅读全文
posted @ 2012-12-25 10:10 十舍七匹狼 阅读(157) 评论(0) 推荐(0) 编辑
摘要:很多计算机爱好者是从Unix或是Linux操作系统学起的,然而还有很多人是从别的系统学起的,使用不同的命令、不同类型的交互方式。比如说,很有可能你公司的员工更习惯于使用DOS命令,而不是一个shell的解提示器。使用一系列的alias可以稍微减少一点这种差异,比如说将dos命令映射城unix的ls命令:alias DIR=ls 但如果用户学习过在dos下/w表示宽列表格式的话,这种映射就没什么效果了。因为unix命令会警告没有/w目录。取而代之,像之前写的那些改变输入的封装器一样,接下来的DIR脚本就是用来映射一种类型命令选项到另一种环境中去。代码: 1 #!/bin/sh 2 3 # D.. 阅读全文
posted @ 2012-12-24 10:25 十舍七匹狼 阅读(208) 评论(0) 推荐(0) 编辑
摘要:Linux系统上一个很有用的,但不一定会出现在别的Unix版本上的命令是 locate。该命令会搜索一个预建的文件名数据库来查找特定的正则表达式。要是想要快速查找主要的.cshrc文件的位置呢?下面的是用locate的解决方法:1 locate .cshrc2 /.Trashes/501/Previous Systems/private/etc/csh.cshrc 3 /OS9 Snapshot/Staging Archive/:home/taylor/.cshrc 4 /private/etc/csh.cshrc 5 /Users/taylor/.cshrc 6 /Volumes/110G. 阅读全文
posted @ 2012-12-21 17:11 十舍七匹狼 阅读(166) 评论(0) 推荐(0) 编辑
摘要:ls命令是Unix命令行的基础,该命令中有一个元素在我而言不得要领:指示目录的大小。当一个目录被列出来的时候,程序要么是列出文件的内容,要么是显示文件数据的1024字节块的数目。一个典型的ls -l的输出如下:drwxrwxr-x 2 taylor taylor 4096 Oct 28 19:07 bin 但是,事实上,这些内容并不是很有用处,因为我想要知道的是给定目录中有多少个文件。这就是这个脚本要达到的目的,生成一个漂亮的多层文件、目录列表,同时显示了文件大小或是目录中的文件数。代码: 1 #!/bin/sh 2 3 # formatdir.sh -- 输出一个界面友好、功能有效的目... 阅读全文
posted @ 2012-12-20 16:41 十舍七匹狼 阅读(979) 评论(0) 推荐(1) 编辑
摘要:这个脚本是一个叫做wrappers脚本的完整类的示例。wrappers的基础思想是它们处于一个真实的Unix命令和用户之间,它在对真实的单个命令不可用的情况下,会给用户提供不同的、有效的功能。在这个脚本中,在不通知用户的情况下,用rm命令删除文件的操作实际上会被写入一个单独的log文件。(这段话真难理解,只有看到了wrappers的时候,或许才能理解。这个脚本的目的很简单,就是使用rm命令来删除文件时可以用本脚本文件作为一个替代,在使用本脚本时,如果不使用-s选项,则会记录这个删除操作到一个文本文件中。)代码: 1 #!/bin/sh 2 3 # logrm.sh -- 记录所有的文件删除.. 阅读全文
posted @ 2012-12-19 15:32 十舍七匹狼 阅读(143) 评论(0) 推荐(0) 编辑
摘要:既然有了一个被删除文件的目录,而且这个目录是在用户的家目录下的隐藏目录,那么一个让用户检索这些已删除文件的脚本的程序就会非常有用了。不管怎样,想要表明所有可能发生的情况是很难的,因为它包括了没有匹配、仅有一个匹配以及多个匹配三种情况。在多个匹配的情形中,比如,你是想要挑出最新的文件,然后将它还原?还是指明有多少种情况匹配成功,然后就退出?又或是展示下不同情况的数据然后供用户挑选?下面,让我们来看看我们到底都能做些什么...代码: 1 #!/bin/sh 2 3 # unrm.sh -- 查找已删除文档中的给定文件或是目录 4 # 如果有多个匹配,那么给出一个按时间戳排序的结果列表,... 阅读全文
posted @ 2012-12-18 14:53 十舍七匹狼 阅读(138) 评论(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 十舍七匹狼 阅读(148) 评论(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 十舍七匹狼 阅读(131) 评论(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 十舍七匹狼 阅读(1012) 评论(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 十舍七匹狼 阅读(147) 评论(0) 推荐(0) 编辑
摘要:尽管你可能还没有意识到,可你的标准终端应用是能够支持不同的文本风格。大量不同的风格是可能的,不管你是想要在你的脚本中让特定的词使用粗体,还是在一个黄色背景下使用红色字体。使用ANSI(美国国家标准化组织)序列来表现这些不同风格是有难度的,因为这些序列对于用户而言并不是很友好的。因此,这个脚本部分生成了一系列的变量来表示ANSI码,这样就可以用它们来决定是否使用不同的颜色和格式。代码:#!/bin/sh# ANSIColor.sh -- 使用下面的变量表示不同的颜色# 和格式。以f结尾的词表示文本颜色。# 以b结尾的词表示背景色。initializeANSI(){ esc="\033& 阅读全文
posted @ 2012-12-12 11:52 十舍七匹狼 阅读(137) 评论(0) 推荐(0) 编辑
摘要:任何脚本,在对共享数据文件,比如日志文件,进行读或追加写操作时,都需要一个可信赖的方法来确保别的脚本进程不会同时更新它。解决问题的思路就是使用一个独立的锁文件,就好像信号一样。它的存在表明了有一个不同的文件正在使用该数据文件,所以此时该数据文件不能被其它人使用。请求文件会等待,然后继续尝试请求使用该数据文件,希望数据文件会被快速释放掉,而判断的关键标志就在于锁文件是否被移除了。但是锁文件的运行很复杂,许多看起来万无一失的情况都有可能失败。比如下面的例子就是一个解决这个问题的典型方法:1 while [ -f $lockfile ]; do2 sleep 13 done4 touch ... 阅读全文
posted @ 2012-12-11 18:10 十舍七匹狼 阅读(190) 评论(0) 推荐(0) 编辑
摘要:在脚本的编写过程中,最常用的恐怕就是$(())了。它可以执行多种基本算术运算。这个表达式非常有用,特别是增加计数器时;并且它支持+ - * / %运算,不过不是所有的整数和小数都行。比如,下面的命令返回的是0,而不是0.5:echo $((1/2)) 所以当一个计算结果需要更高的精度时,这也就意味着你接受了一个挑战。在命令行下没有几个好用的计算程序。除了,比如说,bc,一个很少有Unix用户学习的怪异程序。bc程序会把自己当作一个任意精度的计算器,它使用隐晦的错误信息追溯到Unix的开头,并且完全没有提示,而且,一旦你使用它,它就假定你已经非常明了你正在做什么。但这一切都没有关系,我们可以搞. 阅读全文
posted @ 2012-12-10 17:19 十舍七匹狼 阅读(653) 评论(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 十舍七匹狼 阅读(913) 评论(0) 推荐(1) 编辑