bash shell腳本編程經(jīng)典實(shí)例(第2版)
定 價(jià):159 元
- 作者:[美] 卡爾·阿爾賓(Carl Albing),[美] JP·沃森(JP Vossen)
- 出版時(shí)間:2021/1/1
- ISBN:9787115553782
- 出 版 社:人民郵電出版社
- 中圖法分類:TP316.89
- 頁碼:557
- 紙張:
- 版次:01
- 開本:16開
bash是Linux下常用的shell。用戶可以通過bash,以命令的形式操控Linux系統(tǒng)。作為一本bash用法速查手冊,本書主要內(nèi)容包括:標(biāo)準(zhǔn)輸出和輸入以及執(zhí)行命令;shell變量、shell邏輯和算術(shù);中級shell工具和高級腳本;使用find、locate和slocate查找文件;處理日期和時(shí)間;編寫安全的shell腳本;配置和自定義bash。第2版更新至Git,每個(gè)實(shí)例均包含一個(gè)或多個(gè)示例腳本,并討論了解決方案的工作原理。
對于系統(tǒng)管理員、程序員和最終用戶而言,shell命令或精心設(shè)計(jì)的shell腳本不僅能節(jié)省時(shí)間和精力,還可以提升各種常見任務(wù)的一致性和可重復(fù)性。作為一款流行的Unix shell,bash讓你能夠利用和自定義Unix或Linux系統(tǒng)的任意功能。
本書將全面講述bash,內(nèi)容適用于所有Unix和Linux用戶,無論新人還是老手(包括熟練的Windows用戶和管理員)。
書中提供了300多個(gè)bash實(shí)例,每個(gè)實(shí)例均包含一個(gè)或多個(gè)示例腳本,能夠幫你解決各種各樣的問題。
你將學(xué)到如何處理輸入/輸出、文件操作、程序執(zhí)行、管理任務(wù)以及許多其他挑戰(zhàn)。
本書實(shí)例包括:
標(biāo)準(zhǔn)輸出和輸入以及執(zhí)行命令
shell變量、shell邏輯和算術(shù)
中級shell工具和高級腳本編寫
使用find、locate和slocate查找文件
處理日期和時(shí)間
為各種最終用戶任務(wù)創(chuàng)建shell腳本
處理涉及解析操作的任務(wù)
編寫安全的shell腳本
配置和自定義bash
卡爾·阿爾賓(Carl Albing),計(jì)算機(jī)科學(xué)博士,美國海軍學(xué)院計(jì)算機(jī)科學(xué)系客座教授,曾就職于各種規(guī)模的公司,擁有豐富的軟件經(jīng)驗(yàn)。
JP·沃森(JP Vossen),20世紀(jì)80年代初開始與計(jì)算機(jī)打交道,90年代末開始專注于信息安全工作,曾供稿于《信息安全雜志》和SearchSecurity網(wǎng)站等媒體。
【譯者介紹】
門佳,GNU/Linux深度用戶,喜歡溯本求源,挖掘技術(shù)背后的來龍去脈,對程序語言設(shè)計(jì)理論、編譯技術(shù)、操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)、Web開發(fā)等領(lǐng)域均有涉獵,譯著包括《TCP Sockets編程》《精通JavaScript(第2版)》《Linux命令行與shell腳本編程大全(第3版)》《Linux Shell腳本攻略》《shell腳本實(shí)戰(zhàn)(第2版)》等。
前言 xv
第 1 章 bash入門 1
1.1 為什么是bash 2
1.2 bash shell 3
1.3 提示符揭秘 3
1.4 顯示當(dāng)前位置 4
1.5 查找并運(yùn)行命令 5
1.6 獲取文件的相關(guān)信息 7
1.7 顯示當(dāng)前目錄下的所有隱藏(點(diǎn)號(hào))文件 9
1.8 使用shell引用 12
1.9 使用或替換內(nèi)建命令與外部命令 13
1.10 確定是否處于交互模式 15
1.11 將bash安裝為默認(rèn)shell 15
1.12 持續(xù)更新bash 17
1.13 獲取Linux版的bash 18
1.14 獲取xBSD版的bash 19
1.15 獲取macOS版的bash 20
1.16 獲取Unix版的bash 20
1.17 獲取Windows版的bash 22
1.18 不獲取bash的情況下使用bash 24
1.19 更多的bash文檔 25
第 2 章 標(biāo)準(zhǔn)輸出 28
2.1 輸出到終端/終端窗口 29
2.2 保留輸出中的空白字符 30
2.3 在輸出中加入更多格式控制 31
2.4 消除輸出中的換行符 32
2.5 保存命令輸出 33
2.6 將輸出保存到其他文件 34
2.7 保存ls命令的輸出 34
2.8 將輸出和錯(cuò)誤消息發(fā)送到不同文件 36
2.9 將輸出和錯(cuò)誤消息發(fā)送到同一文件 36
2.10 追加輸出 38
2.11 僅使用文件的起始或結(jié)尾部分 38
2.12 跳過文件標(biāo)題 39
2.13 丟棄輸出 40
2.14 保存或分組多個(gè)命令的輸出 40
2.15 將輸出作為輸入,連接兩個(gè)程序 42
2.16 將輸出作為輸入,同時(shí)保留其副本 43
2.17 以輸出為參數(shù)連接兩個(gè)程序 44
2.18 在一行中多次重定向 46
2.19 重定向不起作用時(shí)保存輸出 47
2.20 交換STDERR和STDOUT 49
2.21 避免意外覆蓋文件 50
2.22 有意覆蓋文件 51
第 3 章 標(biāo)準(zhǔn)輸入 53
3.1 從文件獲取輸入 53
3.2 將數(shù)據(jù)與腳本存放在一起 54
3.3 避免here-document中的怪異行為 55
3.4 縮進(jìn)here-document 57
3.5 獲取用戶輸入 58
3.6 獲取yes或no 59
3.7 選擇選項(xiàng)列表 61
3.8 提示輸入密碼 62
第 4 章 執(zhí)行命令 64
4.1 運(yùn)行程序 64
4.2 依次執(zhí)行多個(gè)命令 66
4.3 同時(shí)執(zhí)行多個(gè)命令 67
4.4 了解命令是否成功運(yùn)行 68
4.5 僅當(dāng)一個(gè)命令運(yùn)行成功后才執(zhí)行下一個(gè)命令 70
4.6 減少if語句的數(shù)量 71
4.7 無人值守下運(yùn)行耗時(shí)作業(yè) 72
4.8 出現(xiàn)故障時(shí)顯示錯(cuò)誤消息 73
4.9 執(zhí)行變量中的命令 74
4.10 執(zhí)行目錄中的所有腳本 75
第 5 章 腳本編程基礎(chǔ):shell變量 76
5.1 記錄腳本 77
5.2 在shell腳本中嵌入文檔 78
5.3 提高腳本可讀性 80
5.4 將變量名與周圍的文本分開 82
5.5 導(dǎo)出變量 82
5.6 查看所有的變量值 84
5.7 在shell腳本中使用參數(shù) 85
5.8 遍歷傳入腳本的參數(shù) 86
5.9 處理包含空格的參數(shù) 87
5.10 處理包含空格的參數(shù)列表 89
5.11 統(tǒng)計(jì)參數(shù)數(shù)量 91
5.12 丟棄參數(shù) 92
5.13 獲取默認(rèn)值 94
5.14 設(shè)置默認(rèn)值 94
5.15 使用空值作為有效的默認(rèn)值 95
5.16 不只使用字符串常量作為默認(rèn)值 96
5.17 對不存在的參數(shù)輸出錯(cuò)誤消息 97
5.18 修改部分字符串 99
5.19 獲得某個(gè)數(shù)的絕對值 101
5.20 用bash實(shí)現(xiàn)basename 102
5.21 用bash實(shí)現(xiàn)dirname 103
5.22 選取CSV的替換值 103
5.23 使用數(shù)組變量 104
5.24 轉(zhuǎn)換大小寫 105
5.25 轉(zhuǎn)換為駝峰命名法 106
第 6 章 shell邏輯與算術(shù) 107
6.1 在shell腳本中執(zhí)行算術(shù)操作 107
6.2 條件分支 109
6.3 測試文件特性 113
6.4 測試多個(gè)特性 115
6.5 測試字符串特性 116
6.6 測試等量關(guān)系 117
6.7 用模式匹配進(jìn)行測試 119
6.8 用正則表達(dá)式測試 120
6.9 用重定向改變腳本行為 122
6.10 循環(huán)一段時(shí)間 123
6.11 在循環(huán)中使用read 125
6.12 循環(huán)若干次 127
6.13 在循環(huán)中使用浮點(diǎn)值 128
6.14 多路分支 128
6.15 解析命令行參數(shù) 130
6.16 創(chuàng)建簡單的菜單 133
6.17 修改簡單菜單的提示符 134
6.18 創(chuàng)建簡單的RPN計(jì)算器 136
6.19 創(chuàng)建命令行計(jì)算器 138
第 7 章 中級shell工具 140
7.1 在文件中查找字符串 141
7.2 只顯示包含搜索結(jié)果的文件名 142
7.3 了解搜索是否成功 143
7.4 不區(qū)分大小寫搜索 144
7.5 在管道中進(jìn)行搜索 145
7.6 縮減搜索結(jié)果 146
7.7 搜索更復(fù)雜的模式 147
7.8 搜索SSN 148
7.9 搜索壓縮文件 149
7.10 保留部分輸出 150
7.11 僅保留部分輸入行 151
7.12 顛倒每行的單詞 152
7.13 匯總數(shù)字列表 153
7.14 用awk統(tǒng)計(jì)字符串出現(xiàn)次數(shù) 154
7.15 用bash統(tǒng)計(jì)字符串出現(xiàn)次數(shù) 156
7.16 用便捷的直方圖展示數(shù)據(jù) 157
7.17 用bash輕松實(shí)現(xiàn)直方圖 159
7.18 顯示匹配短語之后的文本段落 160
第 8 章 中級shell工具(續(xù)) 162
8.1 輸出排序 162
8.2 數(shù)字排序 163
8.3 IP 地址排序 164
8.4 提取部分輸出 167
8.5 刪除重復(fù)行 168
8.6 壓縮文件 169
8.7 解壓文件 171
8.8 檢查tar歸檔文件中不重復(fù)的目錄 172
8.9 轉(zhuǎn)換字符 173
8.10 將大寫字母轉(zhuǎn)換為小寫字母 173
8.11 將DOS文件轉(zhuǎn)換為Linux格式 174
8.12 刪除智能引號(hào) 175
8.13 統(tǒng)計(jì)文件的行數(shù)、單詞數(shù)或字符數(shù) 176
8.14 重新編排段落 177
8.15 你不知道的less 178
第 9 章 查找文件:find、locate、slocate 180
9.1 查找所有的MP3文件 180
9.2 處理文件名中的怪異字符 182
9.3 提升已找到文件的處理速度 183
9.4 跟隨符號(hào)鏈接查找文件 183
9.5 查找文件時(shí)不區(qū)分大小寫 184
9.6 按日期查找文件 185
9.7 按類型查找文件 185
9.8 按大小查找文件 186
9.9 按內(nèi)容查找文件 187
9.10 快速查找現(xiàn)有文件及其內(nèi)容 188
9.11 在可能的位置上查找文件 189
第 10 章 腳本編程的附加特性 193
10.1 腳本“守護(hù)進(jìn)程化” 193
10.2 代碼重用 194
10.3 在腳本中使用配置文件 196
10.4 定義函數(shù) 197
10.5 使用函數(shù):參數(shù)和返回值 198
10.6 中斷陷阱 200
10.7 用別名重新定義命令 204
10.8 避開別名和函數(shù) 206
10.9 計(jì)算已過去的時(shí)間 207
10.10 編寫包裝器 209
第 11 章 處理日期和時(shí)間 214
11.1 格式化日期顯示 214
11.2 提供默認(rèn)日期 216
11.3 自動(dòng)生成日期范圍 217
11.4 將日期和時(shí)間轉(zhuǎn)換為紀(jì)元秒 220
11.5 將紀(jì)元秒轉(zhuǎn)換為日期和時(shí)間 221
11.6 用Perl獲得昨天或明天的日期 222
11.7 日期與時(shí)間運(yùn)算 222
11.8 處理時(shí)區(qū)、夏令時(shí)和閏年 224
11.9 用date和cron在第N天運(yùn)行腳本 225
11.10 輸出帶有日期的日志 226
第 12 章 幫助最終用戶完成任務(wù)的shell腳本 228
12.1 輸出連字符 228
12.2 瀏覽相冊 230
12.3 填裝MP3播放器 235
12.4 刻錄CD 239
12.5 比較文檔 241
第 13 章 與解析相關(guān)的任務(wù) 245
13.1 解析shell腳本參數(shù) 245
13.2 解析參數(shù)時(shí)使用自定義錯(cuò)誤消息 248
13.3 解析HTML 250
13.4 將輸出解析到數(shù)組 251
13.5 用函數(shù)調(diào)用解析輸出 252
13.6 用read語句解析文本 254
13.7 用read將輸入解析至數(shù)組 255
13.8 讀取整個(gè)文件 255
13.9 正確書寫復(fù)數(shù)形式 257
13.10 一次提取一個(gè)字符 258
13.11 清理svn源代碼樹 259
13.12 用MySQL設(shè)置數(shù)據(jù)庫 260
13.13 提取數(shù)據(jù)中的特定字段 261
13.14 更新數(shù)據(jù)文件中的特定字段 264
13.15 修剪空白字符 269
13.16 壓縮空白字符 269
13.17 處理固定長度記錄 271
13.18 處理沒有換行的文件 273
13.19 將數(shù)據(jù)文件轉(zhuǎn)換為CSV 275
13.20 解析CSV數(shù)據(jù)文件 276
第 14 章 編寫安全的shell腳本 277
14.1 避開常見的安全問題 278
14.2 避免解釋器欺騙 279
14.3 設(shè)置安全的$PATH 280
14.4 清除所有的別名 282
14.5 清除命令散列 283
14.6 防止核心轉(zhuǎn)儲(chǔ) 283
14.7 設(shè)置安全的$IFS 284
14.8 設(shè)置安全的umask 285
14.9 在$PATH中查找人皆可寫的目錄 286
14.10 將當(dāng)前目錄加入$PATH 288
14.11 使用安全的臨時(shí)文件 289
14.12 驗(yàn)證輸入 293
14.13 設(shè)置權(quán)限 294
14.14 密碼被泄露到進(jìn)程列表 296
14.15 編寫setuid或setgid腳本 297
14.16 限制訪客 298
14.17 使用chroot囚牢 300
14.18 以非root用戶身份運(yùn)行 301
14.19 更安全地使用sudo 301
14.20 在腳本中使用密碼 303
14.21 使用無密碼的SSH 304
14.22 限制SSH命令 311
14.23 斷開非活躍會(huì)話 314
第 15 章 高級腳本編程 315
15.1 以可移植的方式查找bash 316
15.2 設(shè)置兼容POSIX工具的$PATH 317
15.3 開發(fā)可移植的shell腳本 318
15.4 用虛擬機(jī)測試腳本 320
15.5 使用可移植的循環(huán) 321
15.6 使用可移植的echo 323
15.7 僅在必要時(shí)分割輸出 325
15.8 以十六進(jìn)制形式查看輸出 327
15.9 使用bash的網(wǎng)絡(luò)重定向 328
15.10 查找自己的IP地址 329
15.11 從另一臺(tái)機(jī)器獲取輸入 333
15.12 在腳本運(yùn)行期間重定向輸出 335
15.13 解決“Argument list too long”錯(cuò)誤 335
15.14 向syslog記錄腳本日志 337
15.15 正確地使用logger 338
15.16 在腳本中發(fā)送電子郵件 339
15.17 用階段自動(dòng)化進(jìn)程 343
15.18 一心二用 345
15.19 在多個(gè)主機(jī)上執(zhí)行SSH命令 347
第 16 章 bash的配置與自定義 349
16.1 bash啟動(dòng)選項(xiàng) 349
16.2 自定義提示符 350
16.3 在程序運(yùn)行前出現(xiàn)的提示符 357
16.4 永久修改$PATH 359
16.5 臨時(shí)修改$PATH 360
16.6 設(shè)置$CDPATH 364
16.7 當(dāng)找不到命令時(shí) 366
16.8 縮短或修改命令名稱 367
16.9 調(diào)整shell行為及環(huán)境 368
16.10 用.inputrc調(diào)整readline的行為 369
16.11 通過添加~/bin來存放個(gè)人工具 370
16.12 使用輔助提示符:$PS2、$PS3、$PS4 371
16.13 在會(huì)話間同步shell歷史記錄 373
16.14 設(shè)置shell的歷史選項(xiàng) 374
16.15 創(chuàng)建更好的cd命令 376
16.16 一次性創(chuàng)建并切換到新目錄 378
16.17 直達(dá)底部 379
16.18 用可裝載的內(nèi)建命令為bash添加新特性 380
16.19 改善可編程補(bǔ)全 385
16.20 正確使用初始化文件 389
16.21 創(chuàng)建自包含的可移植rc文件 392
16.22 自定義配置入門 394
第 17 章 內(nèi)務(wù)及管理任務(wù) 407
17.1 批量重命名文件 407
17.2 在Linux中使用GUN Texinfo和info 409
17.3 批量解壓ZIP文件 410
17.4 用screen恢復(fù)斷開的會(huì)話 411
17.5 共享單個(gè)bash會(huì)話 413
17.6 記錄整個(gè)會(huì)話或批量作業(yè) 414
17.7 注銷時(shí)清除屏幕 415
17.8 獲取用于數(shù)據(jù)恢復(fù)的文件元數(shù)據(jù) 416
17.9 為多個(gè)文件創(chuàng)建索引 417
17.10 使用diff和patch 418
17.11 統(tǒng)計(jì)文件間存在多少差異 421
17.12 刪除或重命名名稱中包含特殊字符的文件 423
17.13 將數(shù)據(jù)追加到文件開頭 424
17.14 就地編輯文件 427
17.15 將sudo應(yīng)用于一組命令 429
17.16 查找僅出現(xiàn)在一個(gè)文件中的行 431
17.17 保留最近的N個(gè)對象 433
17.18 寫入循環(huán)日志 436
17.19 循環(huán)備份 438
17.20 搜索不包含grep進(jìn)程自身在內(nèi)的ps輸出 440
17.21 確定某個(gè)進(jìn)程是否正在運(yùn)行 441
17.22 為輸出添加前綴或后綴 443
17.23 對行進(jìn)行編號(hào) 444
17.24 生成序列 446
17.25 模擬DOS的pause命令 448
17.26 為數(shù)值添加逗號(hào) 449
第 18 章 寫得少,干得快 451
18.1 在任意目錄之間快速移動(dòng) 451
18.2 重復(fù)上一個(gè)命令 453
18.3 執(zhí)行類似命令 454
18.4 快速替換 455
18.5 參數(shù)重用 456
18.6 名稱補(bǔ)全 457
18.7 安全第 一 458
18.8 修改多個(gè)命令 459
第 19 章 竅門與陷阱:新手常見錯(cuò)誤 461
19.1 忘記設(shè)置可執(zhí)行權(quán)限 461
19.2 修復(fù)“No such file or directory”錯(cuò)誤 462
19.3 忘記當(dāng)前目錄不在$PATH中 463
19.4 將腳本命名為test 465
19.5 試圖修改已導(dǎo)出的變量 465
19.6 賦值時(shí)忘記加引號(hào) 467
19.7 忘記模式匹配的結(jié)果是按字母順序排列的 468
19.8 忘記管道會(huì)產(chǎn)生子shell 469
19.9 使終端恢復(fù)正常 471
19.10 用空變量刪除文件 472
19.11 printf的怪異行為 473
19.12 測試bash腳本語法 475
19.13 調(diào)試腳本 475
19.14 使用函數(shù)時(shí)避免出現(xiàn)“command not found”錯(cuò)誤 477
19.15 混淆了shell通配符和正則表達(dá)式 478
附錄A 參考 481
附錄B bash自帶的示例 513
附錄C 命令行處理 523
附錄D 修訂控制 528
附錄E 從源代碼構(gòu)建bash 552
關(guān)于作者 557
關(guān)于封面 557