20.13.3用1 ocate查找文件 266 20.13.4在1ess和vim中查找文本 267 20.14总结归纳 269 20.15拓展阅读 269 21文本处理 270 21.1文本应用程序 270 21.1.1文档 271 21.1.2网页 271 21.1.3电子邮件 271 21.1.4打印输出 271 21.1.5程序源码 271 21.2回顾一些老朋友 271 21.2.1cat..· 272 21.2.2sort 273 21.2.3uniq 279 21.3切片和切块 281 21.3.1cut.·. 281 21.3.2 paste. 284 21.3.3join 286 21.4比较文本 289 21.4.1comm 289 21.4.2dif... 290 21.4.3 patch 293 21.5运行时编辑 294 21.5.1tr 294 21.5.2sed. 296 21.5.3 aspell 305 21.6总结归纳 308 21.7拓展阅读 309 21.8友情提示 309 22格式化输出 310 22.1简单的格式化工具 310 10
20.13.3用 locate 查找文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 20.13.4在 less 和 vim 中查找文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 20.14总结归纳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 20.15拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 21 文本处理 270 21.1 文本应用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 21.1.1 文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 21.1.2 网页 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 21.1.3 电子邮件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 21.1.4 打印输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 21.1.5 程序源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 21.2 回顾一些老朋友 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 21.2.1 cat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 21.2.2 sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 21.2.3 uniq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 21.3 切片和切块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 21.3.1 cut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 21.3.2 paste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 21.3.3 join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 21.4 比较文本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 21.4.1 comm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 21.4.2 diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 21.4.3 patch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 21.5 运行时编辑 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 21.5.1 tr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 21.5.2 sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 21.5.3 aspell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 21.6 总结归纳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 21.7 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 21.8 友情提示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 22 格式化输出 310 22.1 简单的格式化工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 10
22.1.1nl-添加行号........ 310 22.1.2fold-限制文件行宽 313 22.1.3fmt-一个简单的文本格式器 314 23打印 316 23.1打印简史 316 23.1.1早期的打印..···· 316 23.1.2基于字符的打印机..... 317 23.1.3图形化打印机....· 318 23.2在Linux下打印 318 23.3为打印准备文件.... 319 23.3.1pr-转换需要打印的文本文件 319 23.4将打印任务送至打印机....·.· 320 23.4.1lpr-打印文件(Berkeley风格) 320 23.4.2lp-打印文件(System V风格) 321 23.4.3另一种选择:a2ps..... 322 23.5监视和控制打印任务..······ 325 23.5.1 Ipstat-显示打印系统状态 325 23.5.2lpq-显示打印机队列状态 326 23.5.3lprm和cancel-取消打印任务 327 24编译程序 328 24.1什么是编译? 328 24.1.1所有的程序都是可编译的吗? 329 24.2编译一个C语言 330 24.2.1得到源码 330 24.3检查源码树·· 332 24.3.1构建程序 334 24.3.2安装程序 338 24.4总结.······ 338 24.5拓展阅读 339 25编写第一个Shell脚本 340 25.1什么是Shell脚本? ·.340 11
22.1.1 nl - 添加行号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 22.1.2 fold - 限制文件行宽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 22.1.3 fmt - 一个简单的文本格式器 . . . . . . . . . . . . . . . . . . . . . . . . . 314 23 打印 316 23.1 打印简史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 23.1.1 早期的打印 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 23.1.2 基于字符的打印机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 23.1.3 图形化打印机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 23.2 在 Linux 下打印 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 23.3 为打印准备文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 23.3.1 pr - 转换需要打印的文本文件 . . . . . . . . . . . . . . . . . . . . . . . . . 319 23.4 将打印任务送至打印机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 23.4.1 lpr - 打印文件(Berkeley 风格) . . . . . . . . . . . . . . . . . . . . . . . 320 23.4.2 lp - 打印文件(System V 风格) . . . . . . . . . . . . . . . . . . . . . . . 321 23.4.3 另一种选择:a2ps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 23.5 监视和控制打印任务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 23.5.1 lpstat - 显示打印系统状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 23.5.2 lpq - 显示打印机队列状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 23.5.3 lprm 和 cancel - 取消打印任务 . . . . . . . . . . . . . . . . . . . . . . . . 327 24 编译程序 328 24.1 什么是编译? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 24.1.1 所有的程序都是可编译的吗? . . . . . . . . . . . . . . . . . . . . . . . . . 329 24.2 编译一个 C 语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 24.2.1 得到源码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 24.3 检查源码树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 24.3.1 构建程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 24.3.2 安装程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 24.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 24.5 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 25 编写第一个 Shell 脚本 340 25.1 什么是 Shell 脚本? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 11
25.2怎样编写一个She1脚本... 340 25.3脚本文件格式.····· 341 25.4可执行权限 342 25.5脚本文件位置 342 25.5.1脚本文件的好去处 344 25.6更多的格式技巧.... 344 25.6.1长选项名称.. 344 25.6.2缩进和行继续符 345 25.7总结归纳 346 25.8拓展阅读 346 26启动一个项目 347 26.1第一阶段:最小的文档 347 26.2第二阶段:添加一点儿数据 350 26.3变量和常量 350 26.3.1给变量和常量赋值 353 26.4 Here Documents 355 26.5总结归纳 357 26.6拓展阅读 358 27自顶向下设计 359 27.1 Shell函数 360 27.2局部变量 363 27.3保持脚本运行 364 27.4总结归纳 。。 368 27.5拓展阅读 368 28流程控制:f分支结构 369 28.1f 369 28.2退出状态 370 28.3测试 372 28.3.1文件表达式 372 28.3.2字符串表达式.. 375 28.3.3整型表达式.·· 376 12
25.2 怎样编写一个 Shell 脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 25.3 脚本文件格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 25.4 可执行权限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 25.5 脚本文件位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 25.5.1 脚本文件的好去处 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 25.6 更多的格式技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 25.6.1 长选项名称 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 25.6.2 缩进和行继续符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 25.7 总结归纳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 25.8 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 26 启动一个项目 347 26.1 第一阶段:最小的文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 26.2 第二阶段:添加一点儿数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 26.3 变量和常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 26.3.1 给变量和常量赋值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 26.4 Here Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 26.5 总结归纳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 26.6 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 27 自顶向下设计 359 27.1 Shell 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 27.2 局部变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 27.3 保持脚本运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 27.4 总结归纳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 27.5 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 28 流程控制:if 分支结构 369 28.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 28.2 退出状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 28.3 测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 28.3.1 文件表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 28.3.2 字符串表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 28.3.3 整型表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 12
28.4更现代的测试版本 377 28.5()-为整数设计 379 28.6结合表达式 380 28.7控制操作符:分支的另一种方法 382 28.8总结 383 28.9拓展阅读...... 384 29读取键盘输入 385 29.1read-从标准输入读取数值 386 29.1.1选项 388 29.2IFS.. 390 29.3校正输入 392 29.4菜单 393 29.5总结归纳 395 29.5.1友情提示 395 29.6拓展阅读 395 30流程控制:while/until循环 396 30.1循环 396 30.1.1 while 397 30.2跳出循环 399 30.2.1 until... . 400 30.3使用循环读取文件 401 30.4总结 402 30.5拓展阅读 402 31疑难排解 403 31.1语法错误 403 31.1.1丢失引号 403 31.1.2丢失或意外的标记 404 31.1.3预料不到的展开.... 405 31.2逻辑错误 407 31.2.1防错编程 407 31.2.2验证输入 409 13
28.4 更现代的测试版本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 28.5 (( )) - 为整数设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 28.6 结合表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 28.7 控制操作符:分支的另一种方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 28.8 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 28.9 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 29 读取键盘输入 385 29.1 read - 从标准输入读取数值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 29.1.1 选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 29.2 IFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 29.3 校正输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 29.4 菜单 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 29.5 总结归纳 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 29.5.1 友情提示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 29.6 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 30 流程控制:while/until 循环 396 30.1 循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 30.1.1 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 30.2 跳出循环 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 30.2.1 until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 30.3 使用循环读取文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 30.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 30.5 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 31 疑难排解 403 31.1 语法错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 31.1.1 丢失引号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 31.1.2 丢失或意外的标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 31.1.3 预料不到的展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 31.2 逻辑错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 31.2.1 防错编程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 31.2.2 验证输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 13
31.3测试........ 409 31.3.1测试案例 410 31.4调试 411 31.4.1找到问题区域 411 31.4.2追踪....... 412 31.4.3执行时检查数值. 414 315总结.....,.... 415 31.6拓展阅读 415 32流程控制:case分支 416 32.1 case 416 32.2模式 418 32.3执行多个动作 420 32.4总结.· 422 32.5拓展阅读 422 33位置参数 423 33.1访问命令行 423 33.1.1确定参数个数.... 424 33.1.2 shift-访问多个参数的利器 425 33.1.3简单应用....···· 427 33.1.4Shel函数中使用位置参数 427 33.2处理集体位置参数 428 33.3一个更复杂的应用 430 33.4总结 433 33.5拓展阅读 436 34流程控制:for循环 438 34.1for:传统shell格式. 438 34.2for:C语言格式.. 441 34.3总结....... 442 34.4拓展阅读 444 35字符串和数字 445 35.1参数展开 445 14
31.3 测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 31.3.1 测试案例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 31.4 调试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 31.4.1 找到问题区域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 31.4.2 追踪 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 31.4.3 执行时检查数值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 31.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 31.6 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 32 流程控制:case 分支 416 32.1 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 32.2 模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 32.3 执行多个动作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 32.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 32.5 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 33 位置参数 423 33.1 访问命令行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 33.1.1 确定参数个数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 33.1.2 shift - 访问多个参数的利器 . . . . . . . . . . . . . . . . . . . . . . . . . . 425 33.1.3 简单应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 33.1.4 Shell 函数中使用位置参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 33.2 处理集体位置参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 33.3 一个更复杂的应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 33.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 33.5 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 34 流程控制:for 循环 438 34.1 for: 传统 shell 格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 34.2 for: C 语言格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 34.3 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 34.4 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 35 字符串和数字 445 35.1 参数展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 14