內容簡介
在本書的再版中,Quigley對她的經典著作進行了全新的改版,增加了當前shell程式設計師所需的最新內容——使用bash進行Linux shell編程。
本書匯聚了Quigley 21年來的 shell編程教學經驗。書中不僅展示了能幫助讀者快速入門的大量精選範例,還系統地講解了UNIX與GNU/Linux上的awk、sed及grep等內容。在Quigley的指導下,即使是shell初學者也可以學會UNIX/Linux上所有主流shell的編程知識,包括5種shell的互動式命令及腳本編程,從而領會作者的編程思路。本書可作為shell編程的入門教程,也是系統管理員、程式設計人員的必備參考。
圖書目錄
第1章UNIX/Linuxshell簡介 1
1.1UNIX與Linux及其歷史 1
1.1.1UNIX簡介 1
1.1.2為什麼選擇Linux 2
1.2shell的定義與功能 3
1.2.1UNIXshell 4
1.2.2Linux的shell 4
1.3shell的歷史 6
1.3.1shell的作用 7
1.3.2shell的職責 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.7shell和信號 25
1.7在腳本中執行命令 26
第2章shell編程快速入門 27
2.1shell腳本簡介 27
2.2腳本實例:主要shell的比較 27
2.2.1開始之前 27
2.2.2示例說明 28
2.3Cshell與TCshell的語法和
結構 28
2.4Bourneshell的語法和結構 34
2.5Kornshell結構 41
2.6Bashshell結構 49
第3章正則表達式與模式匹配 57
3.1正則表達式 57
3.1.1定義和示例 57
3.1.2正則表達式元字元 58
3.2組合正則表達式元字元 63
第4章grep家族 69
4.1grep命令 69
4.1.1grep的含義 69
4.1.2grep如何工作 70
4.1.3元字元 70
4.1.4grep的退出狀態 72
4.2使用正則表達式的grep實例 72
4.3grep的選項 77
4.4grep與管道 79
4.5egrep(擴展的grep) 80
4.5.1egrep示例 81
4.5.2egrep回顧 83
4.6fgrep(固定的grep或
快速的grep) 83
4.7Linux與GNUgrep 84
4.8帶正則表達式的GNU
基本grep(grep-G) 87
4.9grep–E或egrep
(GNU擴展grep) 88
4.9.1grep–E和egrep實例 89
4.9.2grep變體的不規則形式 92
4.10固定的grep(grep–F和fgrep) 95
4.11遞歸的grep(rgrep,grep-R) 95
4.12帶選項的GNUgrep 95
4.13帶選項的grep
(UNIX和GNU) 97
第5章流編輯器sed 105
5.1sed簡介 105
5.2sed的不同版本 105
5.3sed的工作過程 106
5.4正則表達式 106
5.5定址 107
5.6命令與選項 108
5.6.1用sed修改檔案 109
5.6.2GNUsed的選項 109
5.7報錯信息和退出狀態 110
5.8元字元 110
5.9sed範例 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.10sed腳本編程 126
5.10.1sed腳本範例 127
5.10.2回顧 129
第6章awk實用程式 131
6.1什麼是awk、nawk、gawk 131
6.1.1awk簡介 131
6.1.2awk版本 131
6.2awk的格式 132
6.2.1從檔案輸入 132
6.2.2從命令輸入 133
6.3awk工作原理 134
6.4格式化輸出 135
6.4.1print函式 135
6.4.2OFMT變數 136
6.4.3printf函式 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.3BEGIN模式 174
6.13.4END模式 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.3BEGIN模式 183
6.16.4END模式 184
6.16.5包含BEGIN和END
模式的awk腳本 185
6.16.6printf函式 186
6.16.7重定向與管道 187
6.16.8打開和關閉管道 188
6.17條件語句 190
6.17.1if語句 190
6.17.2if/else語句 190
6.17.3if/else和elseif語句 191
6.18循環 192
6.18.1while循環 192
6.18.2for循環 193
6.18.3循環控制 193
6.19程式控制語句 194
6.19.1next語句 194
6.19.2exit語句 194
6.20數組 194
6.20.1關聯數組的下標 195
6.20.2處理命令行參數(nawk) 200
6.21awk的內置函式 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.26awk內置函式 221
6.26.1字元串函式 221
6.26.2gawk的時間函式 224
6.26.3命令行參數 226
6.26.4讀輸入(getline) 227
6.26.5控制函式 228
6.26.6用戶自定義函式 229
6.26.7awk/gawk命令行選項 229
第7章互動式的Bourneshell 233
7.1簡介 233
7.2環境 234
7.2.1初始化檔案 234
7.2.2提示符 237
7.2.3搜尋路徑 238
7.2.4hash命令 238
7.2.5dot命令 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.12here文檔與重定向輸入 265
第8章Bourneshell編程 269
8.1簡介 269
8.2讀取用戶輸入 271
8.3算術運算 272
8.3.1整數運算與expr命令 273
8.3.2浮點運算 273
8.4位置參量和命令行參數 274
8.4.1set命令與位置參量 275
8.4.2$*和$@有何區別 277
8.5條件結構和流控制 278
8.5.1測試退出狀態:test命令 279
8.5.2if命令 280
8.5.3exit命令和?變數 282
8.5.4檢查空值 283
8.5.5if/else命令 284
8.5.6if/elif/else命令 285
8.5.7檔案測試 287
8.5.8null命令 287
8.5.9case命令 289
8.5.10用here文檔和case
命令生成選單 290
8.6循環命令 291
8.6.1for命令 291
8.6.2詞表中的$*和$@變數 293
8.6.3while命令 295
8.6.4until命令 297
8.6.5循環控制命令 298
8.6.6嵌套循環和循環控制 302
8.6.7I/O重定向和子shell 304
8.6.8在後台執行循環 306
8.6.9exec命令和循環 307
8.6.10IFS和循環 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.2eval命令和命令行解析 324
8.10shell的調用選項 325
8.10.1set命令和選項 326
8.10.2shell的內置命令 326
第9章互動式的Cshell與TCshell 335
9.1簡介 335
9.2環境 336
9.2.1初始化檔案 336
9.2.2搜尋路徑 338
9.2.3rehash命令 339
9.2.4hashstat命令 339
9.2.5source命令 339
9.2.6shell提示符 340
9.3C/TCshell命令行 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.3jobs命令 352
9.6.4前台和後台命令 353
9.7shell元字元 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.2here文檔 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互動式TCshell的新特性 381
9.13.1tcsh的版本 382
9.13.2shell提示符 382
9.14TCshell命令行 385
9.14.1命令行與退出狀態 385
9.14.2TCshell命令行歷史 386
9.14.3內置命令行編輯器 393
9.15TCshell命令、檔案名稱
與變數補齊 399
9.15.1autolist變數 399
9.15.2fignore變數 400
9.15.3shell變數complete 401
9.15.4編程補全 401
9.16TCshell拼寫校正 405
9.17TCshell別名 406
9.17.1列出別名 406
9.17.2創建別名 407
9.17.3刪除別名 408
9.17.4別名循環 408
9.17.5特殊的tcsh別名 408
9.18TCshell作業控制 409
9.18.1jobs命令與listjobs變數 409
9.18.2前台與後台命令 410
9.18.3作業調度 411
9.19在TCshell中顯示變數的值 412
9.19.1echo命令 412
9.19.2printf命令 413
9.19.3花括弧與變數 414
9.19.4大小寫轉換 415
9.20TCshell內置命令 416
9.20.1特殊的內置T/TC
shell變數 424
9.20.2TCshell命令行開關 429
第10章Cshell與TCshell編程 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.3if語句 444
10.6.4測試未設定或值為
空的變數 445
10.6.5if/else語句 445
10.6.6邏輯表達式 446
10.6.7if語句和單條命令 447
10.6.8if/elseif語句 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.14goto命令 451
10.6.15Cshell檔案測試 452
10.6.16test命令與檔案測試 453
10.6.17條件結構的嵌套 454
10.6.18TCshell檔案測試 455
10.6.19內置命令filetest(tcsh) 456
10.6.20新增的TCshell檔案
測試操作 457
10.6.21switch命令 459
10.6.22here文檔和選單 461
10.7循環命令 463
10.7.1foreach循環 463
10.7.2while循環 465
10.7.3repeat命令 466
10.7.4循環控制命令 466
10.8中斷處理 470
10.9setuid腳本 471
10.10保存腳本 471
10.11內置命令 472
第11章互動式Kornshell 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.7noglob變數 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.1exec命令和重定向 531
11.13.2重定向與子shell 532
11.14管道 533
11.15time命令 535
11.15.1time命令 535
11.15.2TMOUT變數 536
第12章Kornshell編程 537
12.1簡介 537
12.2讀取用戶輸入 539
12.2.1read命令和檔案描述符 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.7if命令 555
12.5.8使用老式風格的
Bournetest 556
12.5.9使用新式風格的
Korntest 557
12.5.10使用舊式風格的帶數字
表達式的Bournetest 557
12.5.11let命令和數字測試 557
12.5.12if/else命令 558
12.5.13if/elif/else命令 559
12.5.14exit命令 560
12.5.15null命令 561
12.5.16case命令 562
12.6循環命令 564
12.6.1for命令 564
12.6.2詞表中的變數$*和$@ 566
12.6.3while命令 567
12.6.4until命令 569
12.6.5select命令和選單 570
12.6.6循環控制命令 573
12.6.7嵌套循環和循環控制 576
12.6.8I/O重定向和循環 577
12.6.9在後台運行循環 578
12.6.10exec命令和循環 579
12.6.11IFS和循環 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.5typeset命令和函式選項 587
12.9trap命令 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.15Kornshell調用參數 607
第13章互動式bashshell 619
13.1簡介 619
13.1.1bash版本 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.5hash命令 634
13.2.6source或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.2pushd命令和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
(bash2.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.19shell調用選項 697
13.19.1set命令和選項 697
13.19.2shopt命令和選項 699
13.20shell內置命令 700
第14章bashshell編程 705
14.1簡介 705
14.2讀取用戶輸入 707
14.2.1變數 707
14.2.2read命令 707
14.3算術運算 710
14.3.1整數運算(declare
和let命令) 710
14.3.2浮點數運算 712
14.4位置參量和命令行參數 712
14.4.1位置參量 712
14.4.2set命令與位置參量 714
14.5條件結構和流程控制 717
14.5.1退出狀態 717
14.5.2內置命令test與let 717
14.5.3if命令 722
14.5.4if/else命令 726
14.5.5if/elif/else命令 727
14.5.6檔案測試 729
14.5.7null命令 731
14.5.8case命令 733
14.6循環命令 735
14.6.1for命令 735
14.6.2詞表中的$*和@變數 737
14.6.3while命令 738
14.6.4until命令 741
14.6.5select命令和選單 742
14.6.6循環控制命令 746
14.6.7I/O重定向與子shell 752
14.6.8在後台執行循環 754
14.6.9IFS和循環 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.2eval命令和命令行
解析 773
14.11bash的選項 774
14.11.1shell調用選項 774
14.11.2set命令及其選項 775
14.11.3shopt命令及其選項 776
14.12shell的內置命令 778
14.13bashshell的習題 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.5shbang行 791
15.3.6別名問題 792
15.4可能導致語法錯誤的原因 793
15.4.1未定義變數與誤寫變數 793
15.4.2未完成的編程語句 795
15.4.35種shell中常見的
錯誤信息 806
15.4.4邏輯錯誤與健壯性 814
15.5使用shell選項與set命令
進行跟蹤 821
15.5.1調試Bourneshell腳本 821
15.5.2調試C/TCshell腳本 822
15.5.3調試Kornshell腳本 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