高级Bash脚本编程指南

上传人:ji****72 文档编号:115177633 上传时间:2019-11-12 格式:DOCX 页数:83 大小:172.60KB
返回 下载 相关 举报
高级Bash脚本编程指南_第1页
第1页 / 共83页
高级Bash脚本编程指南_第2页
第2页 / 共83页
高级Bash脚本编程指南_第3页
第3页 / 共83页
高级Bash脚本编程指南_第4页
第4页 / 共83页
高级Bash脚本编程指南_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《高级Bash脚本编程指南》由会员分享,可在线阅读,更多相关《高级Bash脚本编程指南(83页珍藏版)》请在金锄头文库上搜索。

1、<p>&lt;p&gt;&amp;lt;p&amp;gt;&amp;amp;lt;p&amp;amp;gt;高级Bash脚本编程指南:从一个简单的script出发成于坚持,败于止步开始shell脚本编程学习,路途遍布荆棘啊,O(_)O,开始吧,这是“高级Bash脚本编程指南”为我们量身打造的“HelloWorld”,其实也不算,因为这个只是我们无比熟悉的命令的堆叠嘛!O(_)O清除/var/log下的log文件html&amp;amp;amp;#160;view plaincopy1. #&amp;amp;amp;#1

2、60;清除,当然要使用root身份来运行这个脚本.&amp;amp;amp;#160;&amp;amp;amp;#160;2. &amp;amp;amp;#160;&amp;amp;amp;#160;3. cd&amp;amp;amp;#160;/var/log&amp;amp;amp;#160;&amp;amp;amp;#160;4. cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;mess

3、ages&amp;amp;amp;#160;&amp;amp;amp;#160;5. cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;wtmp&amp;amp;amp;#160;&amp;amp;amp;#160;6. echo&amp;amp;amp;#160;&amp;amp;amp;quot;Logs&amp;amp;amp;#160;cleaned&amp;amp;amp;#1

4、60;up.&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;像分析helloworld 一样,我们也说下这个shell脚本吧!这根本就没什么稀奇的, 只不过是命令的堆积, 来让从console或者xterm中一个一个的输入命令更方便一些. 好处就是把所有命令都放在一个脚本中,不用每次都敲它们. 这样的话, 这个脚本就成为了一个工具, 对于特定的应用来说,这个脚本就很容易被修改或定制.其中,第一条#后面带一句话,你该猜到了,没错,这是注释,将来你会经常和他打交道,先见下面吧cd /var/log 这简单,我天天在

5、用,我就别废话了cat /dev/null &amp;amp;amp;gt; messages 这个前面简单我也天天用,不过后面是什么,有可能就像“仝”这个字,上下分开,一年级小学生都会,可是这样拼在一起,就不一定了,具体是什么字自己去查哈,这里告诉这条语句的作用是把cat /dev/null 得到的内容保存到messages中,先混个脸熟吧下一句你该乐了,该学了一招嘛但是这里我还是决定多花点时间说说这里的这个/dev/null,因为也许你还不知道为什么要保存到messages和wtmp中,而且cat 的为什么是/dev/null在Linux操作系统中/dev/null和/dev/ze

6、ro是两个相似却又很特殊的文件,特别是在shell脚本开发和系统运维过程中会经常用这两个文件,因此作为Linux系统工程师,你必须了解这两个文件的区别和用法。一、/dev/null的用法:我们可以把/dev/null文件看作”黑洞”,它非常等价于一个只写文件,所有写入/dev/null文件的内容都会丢失,而从/dev/null文件中也读取不到任何内容。然而,也正因为这些特点,在shell脚本开发和命令行维护时,/dev/null文件就可大展身手,显得非常的有用。1. 禁止标准输出例如:cat查看$filename文件,其回显信息将为空html&amp;amp;amp;#160;view

7、 plaincopy1. #&amp;amp;amp;#160;cat&amp;amp;amp;#160;$filename&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;#160;2. 禁止标准错误例如:rm删除文件时,若$badname文件不存在,那么如下的方式则会过滤回显的错误信息html&amp;amp;amp;#160;view plaincopy1. #&amp;amp;amp

8、;#160;rm&amp;amp;amp;#160;$badname&amp;amp;amp;#160;2&amp;amp;amp;gt;&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;#160;3. 禁止标准输出和标准错误的输例如:cat查看$filename文件html&amp;amp;amp;#160;view plaincopy1. #&amp;amp;amp;#160;cat&amp;amp;amp;#160;$filename&amp;

9、amp;amp;#160;2&amp;amp;amp;gt;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;/dev/null&amp;amp;amp;#160;&amp;amp;amp;#160;# 如果”$filename”不存在,将不会有任何错误信息提示.# 如果”$filename”存在, 文件的内容不会打印到标准输出.# 因此上面的代码根本不会输出任何信息.4. 清除日志文件内容例如:html&amp;amp;amp;#160;view plaincopy1. #&amp;amp;amp;#

10、160;cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;/var/log/wtmp&amp;amp;amp;#160;&amp;amp;amp;#160;2. #&amp;amp;amp;#160;cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;/var/log/messages

11、&amp;amp;amp;#160;&amp;amp;amp;#160;# : &amp;amp;amp;gt; /var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)这里你还要知道怎么就会清空了wtmp和messages这两个文件呢?因为你cat /dev/null的结果为空啊,然后你又把空内容保存到这两个文件中,不就相当于清空嘛5. /dev/null的特殊用法,程序打印的日志将不再记录,避免系统空间被不需要的日志所占用稍微高级一点的,例如:html&amp;amp;amp;#160;view plaincopy1. #&

12、amp;amp;amp;amp;#160;ln&amp;amp;amp;#160;-s&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;/.netscape/cookies&amp;amp;amp;#160;&amp;amp;amp;#160;将该cookie的日志文件链接到/dev/null,那么往该文件中写入的内容都将被抛弃二、/dev/zero的用法:/dev/zero和/dev/null一样,也是一个伪文件,但/dev/zero实际上能产生连续不断的null的流(二进制的零流,而不是ASCII型的),写入/

13、dev/zero的输出会丢失不见,而从/dev/zero读出一连串的null也比较困难,虽然这也能通过dd或一个十六进制编辑器来做到,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,它通常都是配合dd命令一起使用的。1. 用/dev/zero创建一个指定大小的临时文件例如:结合dd命令可创建一个大小为1024*1000bit的文件/swap,当然这个文件的大小可通过bs和count参数去调整html&amp;amp;amp;#160;view plaincopy1. #&amp;amp;amp;#160;dd&amp;amp;amp;#160;if

14、=/dev/zero&amp;amp;amp;#160;of=/swap&amp;amp;amp;#160;bs=1024&amp;amp;amp;#160;count=1000&amp;amp;amp;#160;&amp;amp;amp;#160;2. 通过/dev/zero将零填充到一个指定大小的文件,以使用某些特殊需求例如:把RAM设备的内容用零填充,从而实现格式化RAM的目的html&amp;amp;amp;#160;view plaincopy1. #&amp;amp;amp;#160;dd&amp;amp;amp;#1

15、60;if=/dev/zero&amp;amp;amp;#160;of=$DEVICE&amp;amp;amp;#160;count=$SIZE&amp;amp;amp;#160;bs=$BLOCKSIZE&amp;amp;amp;#160;&amp;amp;amp;#160;综上所述,/dev/null和/dev/zero文件的区别和用法如下:/dev/null文件是空设备,也称为位桶(bit bucket),它主要是用于“被写入”,任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到/dev/null。因此凡是向

16、/dev/null输入的任何数据,它通吃,并且不会撑着!/dev/zero文件主要是用作一个标准的“0”输入设备,它可无穷尽地提供0,可以使用/dev/zero来初始化文件。清除:一个改良的清除脚本html&amp;amp;amp;#160;view plaincopy1. #!/bin/bash&amp;amp;amp;#160;&amp;amp;amp;#160;2. LOG_DIR=/var/log&amp;amp;amp;#160;&amp;amp;amp;#160;3. cd&amp;amp;amp;#160;$LOG_DIR&

17、amp;amp;amp;#160;&amp;amp;amp;#160;4. cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;messages&amp;amp;amp;#160;&amp;amp;amp;#160;5. cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;wtmp&am

18、p;amp;amp;amp;#160;&amp;amp;amp;#160;6. echo&amp;amp;amp;#160;&amp;amp;amp;quot;Logs&amp;amp;amp;#160;cleaned&amp;amp;amp;#160;up.&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;7. exit&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160;# 这个命令是一种正确

19、并且合适的退出脚本的方法,算是比较标准的“helloworld”现在,让我们看一下一个真正意义的脚本,而且我们可以走得更远 ,这里只是将上面的单条命令汇总到一个bash文件中一并处理,俗称“批处理”清除: 一个增强的和广义的删除logfile的脚本html&amp;amp;amp;#160;view plaincopy1. #!/bin/bash&amp;amp;amp;#160;&amp;amp;amp;#160;2. LOG_DIR=/var/log&amp;amp;amp;#160;&amp;amp;amp;#160;3. ROOT_UID=0&a

20、mp;amp;amp;amp;#160;&amp;amp;amp;#160;4. LINES=10&amp;amp;amp;#160;&amp;amp;amp;#160;5. E_XCD=66&amp;amp;amp;#160;&amp;amp;amp;#160;6. E_NOTROOT=67&amp;amp;amp;#160;&amp;amp;amp;#160;7. &amp;amp;amp;#160;&amp;amp;amp;#160;8. if&amp;amp;amp;#160;&amp;amp;am

21、p;#160;&amp;amp;amp;quot;$UID&amp;amp;amp;quot;&amp;amp;amp;#160;-ne&amp;amp;amp;#160;&amp;amp;amp;quot;$ROOT_UID&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160;9. then&amp;amp;amp;#160;&amp;amp;amp;#160;10. echo&amp;amp;amp;#16

22、0;&amp;amp;amp;quot;Must&amp;amp;amp;#160;be&amp;amp;amp;#160;root&amp;amp;amp;#160;ro&amp;amp;amp;#160;run&amp;amp;amp;#160;this&amp;amp;amp;#160;script!&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;11. exit&amp;amp;amp;#160;$E_NOTROOT&amp;amp

23、;amp;#160;&amp;amp;amp;#160;12. fi&amp;amp;amp;#160;&amp;amp;amp;#160;13. &amp;amp;amp;#160;&amp;amp;amp;#160;14. #if&amp;amp;amp;#160;&amp;amp;amp;#160;-n&amp;amp;amp;#160;&amp;amp;amp;quot;$1&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;&

24、amp;amp;amp;#160;15. #then&amp;amp;amp;#160;&amp;amp;amp;#160;16. #&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160;lines=$1&amp;amp;amp;#160;&amp;amp;amp;#160;17. #else&amp;amp;amp;#160;&amp;amp;amp;#160;18. #&amp;amp;amp;#160;&amp;amp;amp;#160;&

25、amp;amp;amp;#160;lines=$LINES&amp;amp;amp;#160;&amp;amp;amp;#160;19. #fi&amp;amp;amp;#160;&amp;amp;amp;#160;20. &amp;amp;amp;#160;&amp;amp;amp;#160;21. E_WORNGPARAM=65&amp;amp;amp;#160;&amp;amp;amp;#160;22. case&amp;amp;amp;#160;&amp;amp;amp;quot;$1&amp;am

26、p;amp;quot;&amp;amp;amp;#160;in&amp;amp;amp;#160;&amp;amp;amp;#160;23. &amp;amp;amp;quot;&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;)&amp;amp;amp;#160;lines=10;&amp;amp;amp;#160;&amp;amp;amp;#160;24. *!0-9*)&amp;amp;amp;#160;echo&amp;amp;amp

27、;#160;&amp;amp;amp;quot;Usage:&amp;amp;amp;#160;wong&amp;amp;amp;#160;param!&amp;amp;amp;quot;exit&amp;amp;amp;#160;$E_WRONGPARAM;&amp;amp;amp;#160;&amp;amp;amp;#160;25. *&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160;)&amp;amp;amp;#160;lines=$1;&am

28、p;amp;amp;amp;#160;&amp;amp;amp;#160;26. esac&amp;amp;amp;#160;&amp;amp;amp;#160;27. &amp;amp;amp;#160;&amp;amp;amp;#160;28. #cd&amp;amp;amp;#160;$LOG_DIR&amp;amp;amp;#160;&amp;amp;amp;#160;29. #if&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;quot;$PWD&

29、amp;amp;amp;amp;quot;&amp;amp;amp;#160;!=&amp;amp;amp;#160;&amp;amp;amp;quot;$LOG_DIR&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160;30. #then&amp;amp;amp;#160;&amp;amp;amp;#160;31. #&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;

30、amp;#160;echo&amp;amp;amp;#160;&amp;amp;amp;quot;Can&amp;amp;amp;#39;t&amp;amp;amp;#160;change&amp;amp;amp;#160;to&amp;amp;amp;#160;$LOG_DIR&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;32. #&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160

31、;exit&amp;amp;amp;#160;$E_XCD&amp;amp;amp;#160;&amp;amp;amp;#160;33. #fi&amp;amp;amp;#160;&amp;amp;amp;#160;34. &amp;amp;amp;#160;&amp;amp;amp;#160;35. cd&amp;amp;amp;#160;/var/log&amp;amp;amp;#160;|&amp;amp;amp;#160;&amp;amp;amp;#160;&amp;amp;amp;#160

32、;36. echo&amp;amp;amp;#160;&amp;amp;amp;quot;Can&amp;amp;amp;#39;t&amp;amp;amp;#160;change&amp;amp;amp;#160;to&amp;amp;amp;#160;necessary&amp;amp;amp;#160;directory.&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;amp;2&amp;amp;amp;#160

33、;&amp;amp;amp;#160;37. exit&amp;amp;amp;#160;$E_XCD&amp;amp;amp;#160;&amp;amp;amp;#160;38. &amp;amp;amp;#160;&amp;amp;amp;#160;39. &amp;amp;amp;#160;&amp;amp;amp;#160;40. tail&amp;amp;amp;#160;-$lines&amp;amp;amp;#160;messages&amp;amp;amp;#160;&amp;amp

34、;amp;gt;&amp;amp;amp;#160;mesg.tmp&amp;amp;amp;#160;&amp;amp;amp;#160;41. mv&amp;amp;amp;#160;mesg.tmp&amp;amp;amp;#160;messages&amp;amp;amp;#160;&amp;amp;amp;#160;42. &amp;amp;amp;#160;&amp;amp;amp;#160;43. cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;

35、&amp;amp;amp;gt;&amp;amp;amp;#160;messages&amp;amp;amp;#160;&amp;amp;amp;#160;44. cat&amp;amp;amp;#160;/dev/null&amp;amp;amp;#160;&amp;amp;amp;gt;&amp;amp;amp;#160;wtmp&amp;amp;amp;#160;&amp;amp;amp;#160;45. echo&amp;amp;amp;#160;&amp;amp;amp;quot;Logs

36、&amp;amp;amp;#160;cleaned&amp;amp;amp;#160;up!&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;46. exit&amp;amp;amp;#160;0&amp;amp;amp;#160;&amp;amp;amp;#160;因为你可能希望将系统log全部消灭, 这个版本留下了log消息最后的部分. 你将不断地找到新的方法来完善这个脚本,并提高效率.要注意,在每个脚本的开头都使用 sha-bang ( #!), 这意味着告诉你的系统

37、这个文件的执行需要指定一个解释器. #! 实际上是一个2字节的魔法数字, 这是指定一个文件类型的特殊标记, 换句话说, 在这种情况下, 指的就是一个可执行的脚本(键入man magic来获得关于这个迷人话题的更多详细信息). 在sha-bang之后接着是一个路径名. 这个路径名就是解释脚本中命令的解释程序所在的路径, 可能是一个shell, 也可能是一个程序语言, 也可能是一个工具包中的命令程序.这个解释程序从头开始解释并且执行脚本中的命令(从sha-bang行下边的一行开始), 忽略注释.这里强调文件中的第一个sha-bang才有意义,并且必须在开头,之后如果再次出现sha-bang不会解析

38、为sha-bang,举例说明如下:html&amp;amp;amp;#160;view plaincopy1. #!/bin/bash&amp;amp;amp;#160;&amp;amp;amp;#160;2. echo&amp;amp;amp;#160;&amp;amp;amp;quot;Part&amp;amp;amp;#160;1&amp;amp;amp;#160;of&amp;amp;amp;#160;script.&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;a

39、mp;amp;#160;3. a=1&amp;amp;amp;#160;&amp;amp;amp;#160;4. &amp;amp;amp;#160;&amp;amp;amp;#160;5. #!/bin/bash&amp;amp;amp;#160;#这将不会启动一个新脚本.&amp;amp;amp;#160;&amp;amp;amp;#160;6. echo&amp;amp;amp;#160;&amp;amp;amp;quot;Part&amp;amp;amp;#160;2&amp;amp;amp;#16

40、0;of&amp;amp;amp;#160;script.&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;7. echo&amp;amp;amp;#160;$a&amp;amp;amp;#160;&amp;amp;amp;#160;每一个脚本头的行都指定了一个不同的命令解释器, 如果是/bin/sh, 那么就是默认shell (在Linux系统上默认就是bash), 否则的话就是其他解释器.举例说明如下:html&amp;amp;amp;#160;view plainco

41、py1. #!/bin/rm&amp;amp;amp;#160;&amp;amp;amp;#160;2. #&amp;amp;amp;#160;自删除脚本.作为rm命令,直接删除自己,more命令显示自己的内容&amp;amp;amp;#160;&amp;amp;amp;#160;3. #&amp;amp;amp;#160;当你运行这个脚本时,&amp;amp;amp;#160;基本上什么都不会发生.&amp;amp;amp;#160;.&amp;amp;amp;#160;.&amp;amp;amp;#160;当然

42、这个文件消失不见了.&amp;amp;amp;#160;&amp;amp;amp;#160;4. WHATEVER=65echo&amp;amp;amp;#160;&amp;amp;amp;quot;This&amp;amp;amp;#160;line&amp;amp;amp;#160;will&amp;amp;amp;#160;never&amp;amp;amp;#160;print&amp;amp;amp;#160;(betcha!).&amp;amp;amp;quot;&amp;amp;amp;#160;&amp;amp;amp;#160;5. exit&amp;amp;amp;#160;$WHATEVER&amp;amp;amp;#160;#&amp;amp;amp;#160;不要紧,&amp;amp;amp;#160;脚本是不会在这退出的.&amp;amp;amp;#160;&amp;amp;amp;#160;使用#!/bin/sh, 因为大多数的商业UN&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;</p>

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号