1、高级Bash脚本编程指南 一本深入学习shell脚本艺术的书籍 Mendel Cooper春敏 杨 - 毅 黄 - 3.9.1 2006年5月26日 这本书假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备相关的知识, 那么你将很容易 就能够达到中高级的水平. . . 所有这些只是UNIX浩瀚知识的一小部分. 你可以把本书作为教材, 自 学手册, 或者是关于shell脚本技术的文档. 书中的练习和样例脚本中的注释将会与读者进行更好的互 动, 但是最关键的前提是: 想真正学习脚本编程的唯一途径就是亲自动手编写脚本. 这本书也可作为教材来讲解一般的编程概念. 本文档的最新版本是作为一个归
2、档文件bzip2-ed, “tar包“来发布的, 其中还包括SGML源代码和编译好 的HTML版本. 读者可以从作者的主页上下载. pdf版本也可以从作者的主页上下载. 查看change log来 查看校订历史. 贡献 献给Anita, 我所有动力的源泉! 目录 序 1. 原书作者致中国读者(英文) 2. 原书作者致中国读者(译文) 3. 黄毅 4. 杨春敏 第一部分. 热身 1. 为什么使用shell编程? 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替
3、换 4.2. 变量赋值 4.3. Bash变量是不区分类型的4.4. 特殊的变量类型 5. 引用 5.1. 引用变量 5.2. 转义 6. 退出和退出状态码 7. 条件判断 7.1. 条件测试结构 7.2. 文件测试操作符 7.3. 其他比较操作符 7.4. 嵌套的if/then条件测试 7.5. 检测你对测试知识的掌握情况 8. 操作符与相关主题 8.1. 操作符 8.2. 数字常量 第三部分. 进阶 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定变量的类型: 使用declare或者typeset 9.5. 变量的间接引用 9.6. $RANDO
4、M: 产生随机整数 9.7. 双圆括号结构 10. 循环与分支 10.1. 循环 10.2. 嵌套循环 10.3. 循环控制 10.4. 测试与分支(case与select结构) 11. 内部命令与内建命令 11.1. 作业控制命令 12. 外部过滤器, 程序和命令 12.1. 基本命令 12.2. 复杂命令 12.3. 时间/日期 命令 12.4. 文本处理命令 12.5. 文件与归档命令 12.6. 通讯命令 12.7. 终端控制命令 12.8. 数学计算命令 12.9. 混杂命令 13. 系统与管理命令 13.1. 分析一个系统脚本 14. 命令替换 15. 算术扩展 16. I/O重定
5、向16.1. 使用exec 16.2. 代码块重定向 16.3. 重定向的应用 17. Here Document 17.1. Here String 18. 休息片刻 第四部分. 高级主题 19. 正则表达式 19.1. 一份简要的正则表达式介绍 19.2. 通配(globbing) 20. 子shell 21. 受限shell 22. 进程替换 23. 函数 23.1. 复杂函数和函数复杂性 23.2. 局部变量 23.3. 不使用局部变量的递归 24. 别名 25. 列表结构 26. 数组 27. /dev和/proc 27.1. /dev 27.2. /proc 28. Zero与Nu
6、ll 29. 调试 30. 选项 31. 陷阱 32. 脚本编程风格 32.1. 非官方的Shell脚本编写风格 33. 杂项 33.1. 交互与非交互式的交互与非交互式的shell和脚本 33.2. Shell包装 33.3. 测试和比较: 一种可选的方法 33.4. 递归 33.5. 将脚本“彩色化“ 33.6. 优化 33.7. 各种小技巧 33.8. 安全问题 33.9. 可移植性问题 33.10. Windows下的shell脚本 34. Bash, 版本2与版本3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记35.2. 关于作者
7、 35.3. 译者后记 35.3.1. 杨春敏 35.3.2. 黄毅 35.4. 在哪里可以获得帮助 35.5. 用来制作这本书的工具 35.5.1. 硬件 35.5.2. 软件与排版软件 35.6. 致谢 35.7. 译者致谢 参考文献 A. 捐献的脚本 B. 参考卡片 C. 一个学习Sed和Awk的小手册 C.1. Sed C.2. Awk D. 带有特殊含义的退出码 E. I/O和I/O重定向的详细介绍 F. 命令行选项 F.1. 标准命令行选项 F.2. Bash命令行选项 G. 重要的文件 H. 重要的系统目录 I. 本地化 J. 历史命令 K. 一个简单的.bashrc文件 L.
8、将DOS批处理文件转换为Shell脚本 M. 练习 M.1. 分析脚本 M.2. 编写脚本 N. 修订记录 O. 翻译版修订记录 P. 镜像站点 Q. To Do列表 R. 版权 表格清单 11-1. 作业标识符 30-1. Bash选项 33-1. 转义序列中颜色与数值的对应 B-1. 特殊的shell变量 B-2. 测试操作: 二元比较 B-3. 文件类型的测试操作 B-4. 参数替换和扩展 B-5. 字符串操作 B-6. 一些结构的汇总 C-1. 基本sed操作 C-2. sed操作符举例 D-1. “保留的“退出码 L-1. 批处理文件关键字 / 变量 / 操作符, 和等价的shell
9、符号 L-2. DOS命令与UNIX的等价命令N-1. 修订历史 O-1. 翻译版修订历史 例子清单 2-1. 清除: 清除/var/log下的log文件 2-2. 清除:一个改良的清除脚本 2-3. 清除: 一个增强的和广义的删除logfile的脚本 3-1. 代码块和I/O重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件 4-1. 变量赋值和替换 4-2. 简单的变量赋值 4-3. 简单和复杂, 两种类型的变量赋值 4-4. 整型还是字符串? 4-5. 位置参数 4-6. wh, whois节点名字查询 4-7. 使用shi
10、ft命令 5-1. echo出一些诡异变量 5-2. 转义符 6-1. 退出/退出状态码 6-2. 反转一个条件的用法! 7-1. 什么是真? 7-2. test, /usr/bin/test, , 和/usr/bin/都是等价命令 7-3. 算术测试需要使用( ) 7-4. 测试那些断掉的链接文件 7-5. 算术比较与字符串比较 7-6. 检查字符串是否为null 7-7. zmore 8-1. 最大公约数 8-2. 使用算术操作符 8-3. 使用n 66 | tr -d n | tr 377 n;67 *) usage;68 esac69 70 # 如果是下列的这些情况, 还是很糟糕:71
11、 # printf(“/*“);72 # 或者73 # /* /* buggy embedded comment */74 # 75 # 为了处理上边所有这些特殊情况( 字符串中的注释, 含有 “, “ .76 #+ 的字符串中的注释) 唯一的方法还是写一个C 分析器77 #+ ( 或许可以使用lex 或者yacc?).78 79 exit 0 which which command-xxx将会给出“command-xxx“的完整路径. 当你想在系统中准确定位一个特定的命令或 工具的时候, 这个命令就非常有用了. $bash which rm /usr/bin/rm whereis 与上边的w
12、hich很相似, whereis command-xxx不只会给出“command-xxx“的完整路径, 而且还会给出这 个命令的man页的完整路径. $bash whereis rm rm: /bin/rm /usr/share/man/man1/rm.1.bz2 whatis whatis filexxx将会在whatis数据库中查询“filexxx“. 当你想确认系统命令和重要的配置文件的时 候, 这个命令就非常重要了. 可以把这个命令认为是一个简单的man命令. $bash whatis whatis whatis (1) - search the whatis database for complete words 例子 12-30. 浏览/usr/X11R6/bin1 #!/bin/bash2