UNIX shell范例精解(第4版)

UNIX shell范例精解(第4版)
作 者: 奎格莉 李化 张国强
出版社: 清华大学出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: Solaris
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  Ellie Quigley 著名的“Perl多媒体电脑教室”的创始人、杰出的讲师,以讲授Perl和UNIX shell编程课程而享誉硅谷。她的著作包括Perl by Example,Third Edition(Prentice Hall PTR,2001)、UNIX Shells by example和Linux Shells by Example(Prentice Hall PTR,2000)。在她的公司网站(www.ellieq.com)上还可以找到有关UNIX、Perl、C/C++、Java和系统管理的在线培训课程。

内容简介

在本书的再版中,Quigley对她的经典著作进行了全新的改版,增加了当前shell程序员所需的最新内容——使用bash进行Linux shell编程。.本书汇聚了Quigley 21年来的 shell编程教学经验。书中不仅展示了能帮助读者快速入门的大量精选范例,还系统地讲解了UNIX与GNU/Linux上的awk、sed及grep等内容。在Quigley的指导下,即使是shell初学者也可以学会UNIX/Linux上所有主流shell的编程知识,包括5种shell的交互式命令及脚本编程,从而领会作者的编程思路。本书可作为shell编程的入门教程,也是系统管理员、程序设计人员的必备参考。本版新增内容使用bash进行Linux shell编程shell编程的快速入门shell脚本的调试最新UNIX和GNU /Linux版本的awk、sed和grep命令系统管理员进行shell编程的相关知识,对关键的UNIX /Linux shell脚本的分析 全新内容shell编程基础知识——shell的概念、作用及工作原理为应用程序选择合适的shell近5万名UNIX /Linux系统管理员、开发人员以及高级用户在本书前几个版本的引导下,步入了shell编程专家的行列。因此,即使读者是shell编程方面的新手,也可以通过学习本书而成为这方面的专家。若读者已对shell比较精通,那么本书将成为您寻找可靠的解决方案及代码资源的实用参考。...

图书目录

第1章 UNIX/Linux shell简介 1

1.1 UNIX与Linux及其历史 1

1.1.1 UNIX简介 1

1.1.2 为什么选择Linux 2

1.2 shell的定义与功能 3

1.2.1 UNIX shell 4

1.2.2 Linux的shell 4

1.3 shell的历史 6

1.3.1 shell的作用 7

1.3.2 shell的职责 7

1.4 系统启动与登录shell 7

1.4.1 解析命令行 8

1.4.2 命令类型 8

1.5 进程与shell 10

1.5.1 哪些进程正在运行? 10

1.5.2 系统调用 11

1.5.3 创建进程 12

1.6 环境与继承 15

1.6.1 所有权 15

1.6.2 为文件创建掩码 15

1.6.3 修改权限与所有者 16

1.6.4 工作目录 18

1.6.5 变量 19

1.6.6 重定向与管道 20

1.6.7 shell和信号 25

1.7 在脚本中执行命令 26

第2章 shell编程快速入门 27

2.1 shell脚本简介 27

2.2 脚本实例:主要shell的比较 27

2.2.1 开始之前 27

2.2.2 示例说明 28

2.3 C shell与TC shell的语法和

结构 28

2.4 Bourne shell的语法和结构 34

2.5 Korn shell结构 41

2.6 Bash shell结构 49

第3章 正则表达式与模式匹配 57

3.1 正则表达式 57

3.1.1 定义和示例 57

3.1.2 正则表达式元字符 58

3.2 组合正则表达式元字符 63

第4章 grep家族 69

4.1 grep命令 69

4.1.1 grep的含义 69

4.1.2 grep如何工作 70

4.1.3 元字符 70

4.1.4 grep的退出状态 72

4.2 使用正则表达式的grep实例 72

4.3 grep的选项 77

4.4 grep与管道 79

4.5 egrep(扩展的grep) 80

4.5.1 egrep示例 81

4.5.2 egrep回顾 83

4.6 fgrep(固定的grep或

快速的grep) 83

4.7 Linux与GNU grep 84

4.8 带正则表达式的GNU

基本grep(grep -G) 87

4.9 grep –E或egrep

(GNU扩展grep) 88

4.9.1 grep –E和egrep实例 89

4.9.2 grep变体的不规则形式 92

4.10 固定的grep(grep –F和fgrep) 95

4.11 递归的grep(rgrep,grep -R) 95

4.12 带选项的GNU grep 95

4.13 带选项的grep

(UNIX和GNU) 97

第5章 流编辑器sed 105

5.1 sed简介 105

5.2 sed的不同版本 105

5.3 sed的工作过程 106

5.4 正则表达式 106

5.5 定址 107

5.6 命令与选项 108

5.6.1 用sed修改文件 109

5.6.2 GNU sed的选项 109

5.7 报错信息和退出状态 110

5.8 元字符 110

5.9 sed范例 111

5.9.1 打印:p命令 112

5.9.2 删除:d命令 113

5.9.3 替换:s命令 114

5.9.4 指定行的范围:逗号 116

5.9.5 多重编辑:e命令 117

5.9.6 读文件:r命令 118

5.9.7 写文件:w命令 119

5.9.8 追加:a命令 119

5.9.9 插入:i命令 120

5.9.10 修改:c命令 121

5.9.11 获取下一行:n命令 121

5.9.12 转换:y命令 122

5.9.13 退出:q命令 122

5.9.14 暂存和取用:h命令

和g命令 123

5.9.15 暂存和互换:h命令

和x命令 126

5.10 sed脚本编程 126

5.10.1 sed脚本范例 127

5.10.2 回顾 129

第6章 awk实用程序 131

6.1 什么是awk、nawk、gawk 131

6.1.1 awk简介 131

6.1.2 awk版本 131

6.2 awk的格式 132

6.2.1 从文件输入 132

6.2.2 从命令输入 133

6.3 awk工作原理 134

6.4 格式化输出 135

6.4.1 print函数 135

6.4.2 OFMT变量 136

6.4.3 printf函数 136

6.5 文件中的awk命令 139

6.6 记录与字段 140

6.6.1 记录 140

6.6.2 字段 141

6.6.3 字段分隔符 141

6.7 模式与操作 143

6.7.1 模式 143

6.7.2 操作 144

6.8 正则表达式 145

6.8.1 匹配整行 146

6.8.2 匹配操作符 146

6.9 脚本文件中的awk命令 148

6.10 复习 149

6.10.1 简单的模式匹配 149

6.10.2 简单的操作 150

6.10.3 模式与操作组合的

正则表达式 152

6.10.4 输入字段分隔符 154

6.10.5 编写awk脚本 156

6.11 比较表达式 157

6.11.1 关系运算符 158

6.11.2 条件表达式 159

6.11.3 算术运算 159

6.11.4 逻辑操作符和复合模式 160

6.11.5 范围模式 161

6.11.6 验证数据合法性 161

6.12 复习 162

6.12.1 相等性测试 163

6.12.2 关系运算符 164

6.12.3 逻辑运算符 165

6.12.4 逻辑非运算符 165

6.12.5 算术运算符 166

6.12.6 范围运算符 168

6.12.7 条件运算符 168

6.12.8 赋值运算符 169

6.13 变量 170

6.13.1 数值变量和字符串变量 170

6.13.2 用户自定义变量 171

6.13.3 BEGIN模式 174

6.13.4 END模式 175

6.14 重定向和管道 175

6.14.1 输出重定向 175

6.14.2 输入重定向(getline) 175

6.15 管道 177

6.16 回顾 179

6.16.1 递增和递减运算符 179

6.16.2 内置变量 180

6.16.3 BEGIN模式 183

6.16.4 END模式 184

6.16.5 包含BEGIN和END

模式的awk脚本 185

6.16.6 printf函数 186

6.16.7 重定向与管道 187

6.16.8 打开和关闭管道 188

6.17 条件语句 190

6.17.1 if语句 190

6.17.2 if/else语句 190

6.17.3 if/else和else if语句 191

6.18 循环 192

6.18.1 while循环 192

6.18.2 for循环 193

6.18.3 循环控制 193

6.19 程序控制语句 194

6.19.1 next语句 194

6.19.2 exit语句 194

6.20 数组 194

6.20.1 关联数组的下标 195

6.20.2 处理命令行参数(nawk) 200

6.21 awk的内置函数 202

6.22 内置算术函数 205

6.22.1 整数函数 205

6.22.2 随机数发生器 206

6.23 用户自定义函数(nawk) 207

6.24 复习 208

6.25 杂项 213

6.25.1 固定字段 214

6.25.2 多行记录 216

6.25.3 生成格式信函 217

6.25.4 与shell交互 219

6.26 awk内置函数 221

6.26.1 字符串函数 221

6.26.2 gawk的时间函数 224

6.26.3 命令行参数 226

6.26.4 读输入(getline) 227

6.26.5 控制函数 228

6.26.6 用户自定义函数 229

6.26.7 awk/gawk命令行选项 229

第7章 交互式的Bourne shell 233

7.1 简介 233

7.2 环境 234

7.2.1 初始化文件 234

7.2.2 提示符 237

7.2.3 搜索路径 238

7.2.4 hash命令 238

7.2.5 dot命令 239

7.3 命令行 239

7.3.1 退出状态 240

7.3.2 含多条命令的命令行 240

7.3.3 命令的条件执行 241

7.3.4 在后台执行的命令 241

7.4 元字符(通配符) 242

7.5 文件名替换 242

7.5.1 星号 243

7.5.2 问号 243

7.5.3 方括号 244

7.5.4 转义元字符 244

7.6 变量 245

7.6.1 局部变量 245

7.6.2 设置局部变量 245

7.6.3 环境变量 247

7.6.4 列出已设置的变量 248

7.6.5 复位变量 249

7.6.6 打印变量的值:echo命令 250

7.6.7 变量扩展修饰符 251

7.6.8 位置参数 253

7.6.9 其他特殊变量 254

7.7 引用 255

7.7.1 反斜杠 256

7.7.2 单引号 256

7.7.3 双引号 257

7.8 命令替换 257

7.9 函数入门 258

7.9.1 定义函数 258

7.9.2 列出和复位函数 259

7.10 标准I/O和重定向 259

7.11 管道 264

7.12 here文档与重定向输入 265

第8章 Bourne shell编程 269

8.1 简介 269

8.2 读取用户输入 271

8.3 算术运算 272

8.3.1 整数运算与expr命令 273

8.3.2 浮点运算 273

8.4 位置参量和命令行参数 274

8.4.1 set命令与位置参量 275

8.4.2 $*和$@有何区别 277

8.5 条件结构和流控制 278

8.5.1 测试退出状态:test命令 279

8.5.2 if命令 280

8.5.3 exit命令和?变量 282

8.5.4 检查空值 283

8.5.5 if/else命令 284

8.5.6 if/elif/else命令 285

8.5.7 文件测试 287

8.5.8 null命令 287

8.5.9 case命令 289

8.5.10 用here文档和case

命令生成菜单 290

8.6 循环命令 291

8.6.1 for命令 291

8.6.2 词表中的$*和$@变量 293

8.6.3 while命令 295

8.6.4 until命令 297

8.6.5 循环控制命令 298

8.6.6 嵌套循环和循环控制 302

8.6.7 I/O重定向和子shell 304

8.6.8 在后台执行循环 306

8.6.9 exec命令和循环 307

8.6.10 IFS和循环 308

8.7 函数 309

8.7.1 清除函数 310

8.7.2 函数的参数和返回值 310

8.7.3 函数与dot命令 312

8.8 捕获信号 314

8.8.1 重置信号 315

8.8.2 忽略信号 316

8.8.3 列出陷阱 316

8.8.4 函数中的信号陷阱 317

8.8.5 调试 318

8.9 命令行 319

8.9.1 用getopts处理命令行选项 319

8.9.2 eval命令和命令行解析 324

8.10 shell的调用选项 325

8.10.1 set命令和选项 326

8.10.2 shell的内置命令 326

第9章 交互式C shell与TC shell 335

9.1 简介 335

9.2 环境 336

9.2.1 初始化文件 336

9.2.2 搜索路径 338

9.2.3 rehash命令 339

9.2.4 hashstat命令 339

9.2.5 source命令 339

9.2.6 shell提示符 340

9.3 C/TC shell命令行 341

9.3.1 退出状态 341

9.3.2 命令编组 341

9.3.3 命令的条件执行 342

9.3.4 后台命令 343

9.3.5 命令行历史 343

9.4 别名 347

9.4.1 列出别名 347

9.4.2 创建别名 348

9.4.3 删除别名 348

9.4.4 别名环 349

9.5 操作目录栈 349

9.6 作业控制 351

9.6.1 &号和后台作业 351

9.6.2 暂停键序列和后台作业 352

9.6.3 jobs命令 352

9.6.4 前台和后台命令 353

9.7 shell元字符 353

9.8 文件名替换 354

9.8.1 星号 355

9.8.2 问号 355

9.8.3 方括号 356

9.8.4 花括号 356

9.8.5 转义元字符 357

9.8.6 ~号扩展 357

9.8.7 文件名补全:变量filec 358

9.8.8 用noglob关闭元字符 358

9.9 重定向与管道 359

9.9.1 重定向输入 359

9.9.2 here文档 360

9.9.3 重定向输出 361

9.9.4 将输出追加到已有文件 362

9.9.5 重定向输出和报错信息 362

9.9.6 分离输出与报错信息 363

9.9.7 变量noclobber 364

9.10 变量 365

9.10.1 花括号 366

9.10.2 局部变量 366

9.10.3 环境变量 369

9.10.4 数组 371

9.10.5 专用变量 373

9.11 命令替换 375

9.12 引用 377

9.12.1 反斜杠 378

9.12.2 单引号 378

9.12.3 双引号 379

9.12.4 引用的游戏 379

9.13 交互式TC shell的新特性 381

9.13.1 tcsh的版本 382

9.13.2 shell提示符 382

9.14 TC shell命令行 385

9.14.1 命令行与退出状态 385

9.14.2 TC shell命令行历史 386

9.14.3 内置命令行编辑器 393

9.15 TC shell命令、文件名

与变量补齐 399

9.15.1 autolist变量 399

9.15.2 fignore变量 400

9.15.3 shell变量complete 401

9.15.4 编程补全 401

9.16 TC shell拼写校正 405

9.17 TC shell别名 406

9.17.1 列出别名 406

9.17.2 创建别名 407

9.17.3 删除别名 408

9.17.4 别名循环 408

9.17.5 特殊的tcsh别名 408

9.18 TC shell作业控制 409

9.18.1 jobs命令与listjobs变量 409

9.18.2 前台与后台命令 410

9.18.3 作业调度 411

9.19 在TC shell中显示变量的值 412

9.19.1 echo命令 412

9.19.2 printf命令 413

9.19.3 花括号与变量 414

9.19.4 大小写转换 415

9.20 TC shell内置命令 416

9.20.1 特殊的内置T/TC

shell变量 424

9.20.2 TC shell命令行开关 429

第10章 C shell与TC shell编程 433

10.1 简介 433

10.2 读取用户输入 435

10.2.1 变量$< 435

10.2.2 根据输入的字符串

创建词表 436

10.3 算术运算 436

10.3.1 算术运算符 436

10.3.2 浮点算术运算 438

10.4 脚本调试 438

10.5 命令行参数 440

10.6 条件结构与流控制 442

10.6.1 测试表达式 442

10.6.2 优先级和组合规则 443

10.6.3 if语句 444

10.6.4 测试未设置或值为

空的变量 445

10.6.5 if/else语句 445

10.6.6 逻辑表达式 446

10.6.7 if语句和单条命令 447

10.6.8 if/else if语句 447

10.6.9 退出状态和变量status 448

10.6.10 从shell脚本中退出 448

10.6.11 使用别名创建

错误信息 449

10.6.12 在脚本中使用变量

status 450

10.6.13 在条件结构中对

命令求值 450

10.6.14 goto命令 451

10.6.15 C shell文件测试 452

10.6.16 test命令与文件测试 453

10.6.17 条件结构的嵌套 454

10.6.18 TC shell文件测试 455

10.6.19 内置命令filetest(tcsh) 456

10.6.20 新增的TC shell文件

测试操作 457

10.6.21 switch命令 459

10.6.22 here文档和菜单 461

10.7 循环命令 463

10.7.1 foreach循环 463

10.7.2 while循环 465

10.7.3 repeat命令 466

10.7.4 循环控制命令 466

10.8 中断处理 470

10.9 setuid脚本 471

10.10 保存脚本 471

10.11 内置命令 472

第11章 交互式Korn shell 481

11.1 简介 481

11.2 环境 482

11.2.1 初始化文件 482

11.2.2 提示符 486

11.2.3 搜索路径 487

11.2.4 句点命令 487

11.3 命令行 488

11.3.1 命令执行的次序 488

11.3.2 退出状态 489

11.3.3 含多条命令的命令行

和命令组 490

11.3.4 命令的条件执行 490

11.3.5 后台执行的命令 490

11.3.6 命令行历史 491

11.3.7 命令行编辑 494

11.4 文件名扩展 497

11.5 别名 497

11.5.1 别名列表 498

11.5.2 创建别名 499

11.5.3 删除别名 499

11.5.4 别名定位 499

11.6 作业控制 500

11.7 元字符 501

11.8 文件名替换(通配符) 502

11.8.1 星号 503

11.8.2 问号 503

11.8.3 方括号 504

11.8.4 转义元字符 505

11.8.5 代字符号和连字符扩展 505

11.8.6 新增的ksh元字符 506

11.8.7 noglob变量 507

11.9 变量 507

11.9.1 局部变量 507

11.9.2 环境变量 509

11.9.3 列出已设置的变量 512

11.9.4 复位变量 514

11.9.5 显示变量的值 514

11.9.6 转义序列 516

11.9.7 变量表达式和扩

展修饰符 517

11.9.8 变量子字符串扩展 519

11.9.9 变量属性:typeset命令 520

11.9.10 位置参数 521

11.9.11 其他特殊变量 523

11.10 引用 524

11.10.1 反斜杠 524

11.10.2 单引号 524

11.10.3 双引号 525

11.11 命令替换 525

11.12 函数 527

11.12.1 函数的定义 527

11.12.2 函数和别名 528

11.12.3 列出函数 529

11.12.4 取消函数的定义 529

11.13 标准I/O和重定向 530

11.13.1 exec命令和重定向 531

11.13.2 重定向与子shell 532

11.14 管道 533

11.15 time命令 535

11.15.1 time命令 535

11.15.2 TMOUT变量 536

第12章 Korn shell编程 537

12.1 简介 537

12.2 读取用户输入 539

12.2.1 read命令和文件描述符 541

12.2.2 从整个文件中读取数据 542

12.3 算术运算 542

12.3.1 整型数值 543

12.3.2 使用不同的基数 544

12.3.3 列出所有整型变量 544

12.3.4 算术运算符和let命令 545

12.4 位置参量和命令行参数 547

12.5 分支结构和流程控制 549

12.5.1 测试退出状态和$?变量 550

12.5.2 老的test命令 551

12.5.3 新的test命令 552

12.5.4 带有二元操作符的

文件测试 553

12.5.5 逻辑操作符 553

12.5.6 文件测试 554

12.5.7 if命令 555

12.5.8 使用老式风格的

Bourne test 556

12.5.9 使用新式风格的

Korn test 557

12.5.10 使用旧式风格的带数字

表达式的Bourne test 557

12.5.11 let命令和数字测试 557

12.5.12 if/else命令 558

12.5.13 if/elif/else命令 559

12.5.14 exit命令 560

12.5.15 null命令 561

12.5.16 case命令 562

12.6 循环命令 564

12.6.1 for命令 564

12.6.2 词表中的变量$*和$@ 566

12.6.3 while 命令 567

12.6.4 until命令 569

12.6.5 select命令和菜单 570

12.6.6 循环控制命令 573

12.6.7 嵌套循环和循环控制 576

12.6.8 I/O 重定向和循环 577

12.6.9 在后台运行循环 578

12.6.10 exec命令和循环 579

12.6.11 IFS和循环 580

12.7 数组 581

12.8 函数 583

12.8.1 定义函数 583

12.8.2 列出和取消函数定义 584

12.8.3 局部变量和返回值 584

12.8.4 导出函数 586

12.8.5 typeset命令和函数选项 587

12.9 trap命令 588

12.9.1 伪信号 589

12.9.2 复位信号 589

12.9.3 忽略信号 590

12.9.4 列出信号 590

12.9.5 陷入和函数 592

12.10 协作进程 593

12.11 调试 596

12.12 命令行 598

12.13 安全性 603

12.13.1 特权脚本 603

12.13.2 受限shell 603

12.14 内置命令 603

12.15 Korn shell调用参数 607

第13章 交互式bash shell 619

13.1 简介 619

13.1.1 bash版本 619

13.1.2 启动 620

13.2 环境 621

13.2.1 初始化文件 621

13.2.2 用内置的set和shopt

命令设置bash选项 629

13.2.3 提示符 632

13.2.4 搜索路径 634

13.2.5 hash命令 634

13.2.6 source或dot命令 635

13.3 命令行 636

13.3.1 处理命令的顺序 636

13.3.2 内置命令和help命令 637

13.3.3 改变命令行处理的顺序 637

13.3.4 退出状态 638

13.3.5 含多条命令的命令行 639

13.3.6 命令编组 640

13.3.7 命令的条件执行 640

13.3.8 在后台执行的命令 640

13.4 作业控制 641

13.5 命令行快捷方式 643

13.5.1 命令和文件名补全 643

13.5.2 历史 644

13.5.3 从历史文件访问命令 644

13.5.4 命令行编辑 650

13.6 别名 654

13.6.1 列出别名 654

13.6.2 创建别名 654

13.6.3 删除别名 655

13.7 操作目录栈 655

13.7.1 内置命令dirs 655

13.7.2 pushd命令和popd命令 655

13.8 元字符(通配符) 657

13.9 文件名替换(globbing) 657

13.9.1 星号 658

13.9.2 问号 658

13.9.3 方括号 659

13.9.4 花括号 659

13.9.5 转义元字符 660

13.9.6 代字符号和连字符扩展 661

13.9.7 控制通配符(globbing) 661

13.9.8 扩展的文件名globbing

(bash 2.x) 662

13.10 变量 663

13.10.1 变量类型 663

13.10.2 命名惯例 663

13.10.3 内置命令declare 664

13.10.4 局部变量和作用域 664

13.10.5 环境变量 666

13.10.6 复位变量 671

13.10.7 显示变量值 671

13.10.8 变量扩展修饰符 673

13.10.9 子串的变量扩展 676

13.10.10 位置参量 678

13.10.11 其他特殊变量 679

13.11 引用 680

13.11.1 反斜杠 680

13.11.2 单引号 681

13.11.3 双引号 682

13.12 命令替换 682

13.13 算术扩展 685

13.14 扩展顺序 685

13.15 数组 685

13.16 函数 687

13.16.1 定义函数 688

13.16.2 列出和清除函数 690

13.17 标准I/O和重定向 690

13.18 管道 694

13.19 shell调用选项 697

13.19.1 set命令和选项 697

13.19.2 shopt命令和选项 699

13.20 shell内置命令 700

第14章 bash shell编程 705

14.1 简介 705

14.2 读取用户输入 707

14.2.1 变量 707

14.2.2 read命令 707

14.3 算术运算 710

14.3.1 整数运算(declare

和let命令) 710

14.3.2 浮点数运算 712

14.4 位置参量和命令行参数 712

14.4.1 位置参量 712

14.4.2 set命令与位置参量 714

14.5 条件结构和流程控制 717

14.5.1 退出状态 717

14.5.2 内置命令test与let 717

14.5.3 if命令 722

14.5.4 if/else命令 726

14.5.5 if/elif/else命令 727

14.5.6 文件测试 729

14.5.7 null命令 731

14.5.8 case命令 733

14.6 循环命令 735

14.6.1 for命令 735

14.6.2 词表中的$*和@变量 737

14.6.3 while命令 738

14.6.4 until命令 741

14.6.5 select命令和菜单 742

14.6.6 循环控制命令 746

14.6.7 I/O重定向与子shell 752

14.6.8 在后台执行循环 754

14.6.9 IFS和循环 754

14.7 函数 755

14.7.1 清除函数 756

14.7.2 导出函数 756

14.7.3 函数的参数和返回值 756

14.7.4 函数与source

(或dot)命令 759

14.8 捕获信号 762

14.8.1 重置信号 763

14.8.2 忽略信号 764

14.8.3 列出陷阱 764

14.8.4 函数中的信号陷阱 765

14.9 调试 766

14.10 命令行 768

14.10.1 用getopts处理命令

行选项 768

14.10.2 eval命令和命令行

解析 773

14.11 bash的选项 774

14.11.1 shell调用选项 774

14.11.2 set命令及其选项 775

14.11.3 shopt命令及其选项 776

14.12 shell的内置命令 778

14.13 bash shell的习题 780

第15章 调试shell脚本 787

15.1 简介 787

15.2 风格问题 787

15.3 错误类型 788

15.3.1 运行时错误 788

15.3.2 命名惯例 788

15.3.3 参数不足 789

15.3.4 路径问题 790

15.3.5 shbang行 791

15.3.6 别名问题 792

15.4 可能导致语法错误的原因 793

15.4.1 未定义变量与误写变量 793

15.4.2 未完成的编程语句 795

15.4.3 5种shell中常见的

错误信息 806

15.4.4 逻辑错误与健壮性 814

15.5 使用shell选项与set命令

进行跟踪 821

15.5.1 调试Bourne shell脚本 821

15.5.2 调试C/TC shell脚本 822

15.5.3 调试Korn shell脚本 825

15.5.4 调试bash脚本 827

15.6 小结 830

第16章 系统管理员与shell 831

16.1 简介 831

16.2 超级用户 831

16.3 使用su命令变为超级用户 832

16.3.1 以根用户身份运行脚本 834

16.3.2 以root身份运行的

脚本(setuid程序) 835

16.4 引导脚本 837

16.4.1 相关术语 837

16.4.2 一个引导脚本的例子

—— cron工具 841

16.4.3 编写一个可移植的脚本 845

16.4.4 用户指定初始化文件 848

16.4.5 系统范围内的初始化

文件 849

16.5 小结 855

附录A 常用的UNIX/Linux实用程序 857

附录B 各种shell的比较 899