bash shell腳本編程經典實例(第2版) bash Cookbook: Solutions and Examples for bash Users

Carl Albing,JP Vossen 門佳譯

  • bash shell腳本編程經典實例(第2版)-preview-1
  • bash shell腳本編程經典實例(第2版)-preview-2
bash shell腳本編程經典實例(第2版)-preview-1

商品描述

bash是Linux下常用的shell。
用戶可以通過bash,以命令的形式操控Linux系統。
作為一本bash用法速查手冊,本書主要內容包括:
標準輸出和輸入以及執行命令;shell變量、shell邏輯和算術;中級shell工具和高級腳本;
使用find、locate和slocate查找文件;處理日期和時間;編寫安全的shell腳本;配置和自定義bash。
第2版更新至Git,每個實例均包含一個或多個示例腳本,並討論瞭解決方案的工作原理。

作者簡介

Carl Albing

計算機科學博士,美國海軍學院計算機科學系客座教授,曾就職於各種規模的公司,擁有豐富的軟件經驗。

JP Vossen

20世紀80年代初開始與計算機打交道,90年代末開始專注於信息安全工作,曾供稿於《信息安全雜誌》和SearchSecurity網站等媒體。

 

【譯者介紹】

門佳

GNU/Linux深度用戶,喜歡溯本求源,挖掘技術背後的來龍去脈,對程序語言設計理論、編譯技術、
操作系統設計與實現、Web開發等領域均有涉獵,譯著包括《TCP Sockets編程》《精通JavaScript(第2版)》
《Linux命令行與shell腳本編程大全(第3版)》《Linux Shell腳本攻略》《shell腳本實戰(第2版)》等。

目錄大綱

前言 xv
第 1 章 bash入門 1
1.1 為什麽是bash 2
1.2 bash shell 3
1.3 提示符揭秘 3
1.4 顯示當前位置 4
1.5 查找並運行命令 5
1.6 獲取文件的相關信息 7
1.7 顯示當前目錄下的所有隱藏(點號)文件 9
1.8 使用shell引用 12
1.9 使用或替換內建命令與外部命令 13
1.10 確定是否處於交互模式 15
1.11 將bash安裝為默認shell 15
1.12 持續更新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 章 標準輸出 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 將輸出和錯誤消息發送到不同文件 36
2.9 將輸出和錯誤消息發送到同一文件 36
2.10 追加輸出 38
2.11 僅使用文件的起始或結尾部分 38
2.12 跳過文件標題 39
2.13 丟棄輸出 40
2.14 保存或分組多個命令的輸出 40
2.15 將輸出作為輸入,連接兩個程序 42
2.16 將輸出作為輸入,同時保留其副本 43
2.17 以輸出為參數連接兩個程序 44
2.18 在一行中多次重定向 46
2.19 重定向不起作用時保存輸出 47
2.20 交換STDERR和STDOUT 49
2.21 避免意外覆蓋文件 50
2.22 有意覆蓋文件 51

第 3 章 標準輸入 53
3.1 從文件獲取輸入 53
3.2 將數據與腳本存放在一起 54
3.3 避免here-document中的怪異行為 55
3.4 縮進here-document 57
3.5 獲取用戶輸入 58
3.6 獲取yes或no 59
3.7 選擇選項列表 61
3.8 提示輸入密碼 62

第 4 章 執行命令 64
4.1 運行程序 64
4.2 依次執行多個命令 66
4.3 同時執行多個命令 67
4.4 瞭解命令是否成功運行 68
4.5 僅當一個命令運行成功後才執行下一個命令 70
4.6 減少if語句的數量 71
4.7 無人值守下運行耗時作業 72
4.8 出現故障時顯示錯誤消息 73
4.9 執行變量中的命令 74
4.10 執行目錄中的所有腳本 75

第 5 章 腳本編程基礎:shell變量 76
5.1 記錄腳本 77
5.2 在shell腳本中嵌入文檔 78
5.3 提高腳本可讀性 80
5.4 將變量名與周圍的文本分開 82
5.5 導出變量 82
5.6 查看所有的變量值 84
5.7 在shell腳本中使用參數 85
5.8 遍歷傳入腳本的參數 86
5.9 處理包含空格的參數 87
5.10 處理包含空格的參數列表 89
5.11 統計參數數量 91
5.12 丟棄參數 92
5.13 獲取默認值 94
5.14 設置默認值 94
5.15 使用空值作為有效的默認值 95
5.16 不只使用字符串常量作為默認值 96
5.17 對不存在的參數輸出錯誤消息 97
5.18 修改部分字符串 99
5.19 獲得某個數的絕對值 101
5.20 用bash實現basename 102
5.21 用bash實現dirname 103
5.22 選取CSV的替換值 103
5.23 使用數組變量 104
5.24 轉換大小寫 105
5.25 轉換為駝峰命名法 106

第 6 章 shell邏輯與算術 107
6.1 在shell腳本中執行算術操作 107
6.2 條件分支 109
6.3 測試文件特性 113
6.4 測試多個特性 115
6.5 測試字符串特性 116
6.6 測試等量關系 117
6.7 用模式匹配進行測試 119
6.8 用正則表達式測試 120
6.9 用重定向改變腳本行為 122
6.10 循環一段時間 123
6.11 在循環中使用read 125
6.12 循環若乾次 127
6.13 在循環中使用浮點值 128
6.14 多路分支 128
6.15 解析命令行參數 130
6.16 創建簡單的菜單 133
6.17 修改簡單菜單的提示符 134
6.18 創建簡單的RPN計算器 136
6.19 創建命令行計算器 138

第 7 章 中級shell工具 140
7.1 在文件中查找字符串 141
7.2 只顯示包含搜索結果的文件名 142
7.3 瞭解搜索是否成功 143
7.4 不區分大小寫搜索 144
7.5 在管道中進行搜索 145
7.6 縮減搜索結果 146
7.7 搜索更復雜的模式 147
7.8 搜索SSN 148
7.9 搜索壓縮文件 149
7.10 保留部分輸出 150
7.11 僅保留部分輸入行 151
7.12 顛倒每行的單詞 152
7.13 匯總數字列表 153
7.14 用awk統計字符串出現次數 154
7.15 用bash統計字符串出現次數 156
7.16 用便捷的直方圖展示數據 157
7.17 用bash輕松實現直方圖 159
7.18 顯示匹配短語之後的文本段落 160

第 8 章 中級shell工具(續) 162
8.1 輸出排序 162
8.2 數字排序 163
8.3 IP 地址排序 164
8.4 提取部分輸出 167
8.5 刪除重復行 168
8.6 壓縮文件 169
8.7 解壓文件 171
8.8 檢查tar歸檔文件中不重復的目錄 172
8.9 轉換字符 173
8.10 將大寫字母轉換為小寫字母 173
8.11 將DOS文件轉換為Linux格式 174
8.12 刪除智能引號 175
8.13 統計文件的行數、單詞數或字符數 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 跟隨符號鏈接查找文件 183
9.5 查找文件時不區分大小寫 184
9.6 按日期查找文件 185
9.7 按類型查找文件 185
9.8 按大小查找文件 186
9.9 按內容查找文件 187
9.10 快速查找現有文件及其內容 188
9.11 在可能的位置上查找文件 189

第 10 章 腳本編程的附加特性 193
10.1 腳本“守護進程化” 193
10.2 代碼重用 194
10.3 在腳本中使用配置文件 196
10.4 定義函數 197
10.5 使用函數:參數和返回值 198
10.6 中斷陷阱 200
10.7 用別名重新定義命令 204
10.8 避開別名和函數 206
10.9 計算已過去的時間 207
10.10 編寫包裝器 209

第 11 章 處理日期和時間 214
11.1 格式化日期顯示 214
11.2 提供默認日期 216
11.3 自動生成日期範圍 217
11.4 將日期和時間轉換為紀元秒 220
11.5 將紀元秒轉換為日期和時間 221
11.6 用Perl獲得昨天或明天的日期 222
11.7 日期與時間運算 222
11.8 處理時區、夏令時和閏年 224
11.9 用date和cron在第N天運行腳本 225
11.10 輸出帶有日期的日誌 226
第 12 章 幫助最終用戶完成任務的shell腳本 228
12.1 輸出連字符 228
12.2 瀏覽相冊 230
12.3 填裝MP3播放器 235
12.4 刻錄CD 239
12.5 比較文檔 241

第 13 章 與解析相關的任務 245
13.1 解析shell腳本參數 245
13.2 解析參數時使用自定義錯誤消息 248
13.3 解析HTML 250
13.4 將輸出解析到數組 251
13.5 用函數調用解析輸出 252
13.6 用read語句解析文本 254
13.7 用read將輸入解析至數組 255
13.8 讀取整個文件 255
13.9 正確書寫復數形式 257
13.10 一次提取一個字符 258
13.11 清理svn源代碼樹 259
13.12 用MySQL設置數據庫 260
13.13 提取數據中的特定字段 261
13.14 更新數據文件中的特定字段 264
13.15 修剪空白字符 269
13.16 壓縮空白字符 269
13.17 處理固定長度記錄 271
13.18 處理沒有換行的文件 273
13.19 將數據文件轉換為CSV 275
13.20 解析CSV數據文件 276

第 14 章 編寫安全的shell腳本 277
14.1 避開常見的安全問題 278
14.2 避免解釋器欺騙 279
14.3 設置安全的$PATH 280
14.4 清除所有的別名 282
14.5 清除命令散列 283
14.6 防止核心轉儲 283
14.7 設置安全的$IFS 284
14.8 設置安全的umask 285
14.9 在$PATH中查找人皆可寫的目錄 286
14.10 將當前目錄加入$PATH 288
14.11 使用安全的臨時文件 289
14.12 驗證輸入 293
14.13 設置權限 294
14.14 密碼被泄露到進程列表 296
14.15 編寫setuid或setgid腳本 297
14.16 限制訪客 298
14.17 使用chroot囚牢 300
14.18 以非root用戶身份運行 301
14.19 更安全地使用sudo 301
14.20 在腳本中使用密碼 303
14.21 使用無密碼的SSH 304
14.22 限制SSH命令 311
14.23 斷開非活躍會話 314

第 15 章 高級腳本編程 315
15.1 以可移植的方式查找bash 316
15.2 設置兼容POSIX工具的$PATH 317
15.3 開發可移植的shell腳本 318
15.4 用虛擬機測試腳本 320
15.5 使用可移植的循環 321
15.6 使用可移植的echo 323
15.7 僅在必要時分割輸出 325
15.8 以十六進制形式查看輸出 327
15.9 使用bash的網絡重定向 328
15.10 查找自己的IP地址 329
15.11 從另一臺機器獲取輸入 333
15.12 在腳本運行期間重定向輸出 335
15.13 解決“Argument list too long”錯誤 335
15.14 向syslog記錄腳本日誌 337
15.15 正確地使用logger 338
15.16 在腳本中發送電子郵件 339
15.17 用階段自動化進程 343
15.18 一心二用 345
15.19 在多個主機上執行SSH命令 347

第 16 章 bash的配置與自定義 349
16.1 bash啟動選項 349
16.2 自定義提示符 350
16.3 在程序運行前出現的提示符 357
16.4 永久修改$PATH 359
16.5 臨時修改$PATH 360
16.6 設置$CDPATH 364
16.7 當找不到命令時 366
16.8 縮短或修改命令名稱 367
16.9 調整shell行為及環境 368
16.10 用.inputrc調整readline的行為 369
16.11 通過添加~/bin來存放個人工具 370
16.12 使用輔助提示符:$PS2、$PS3、$PS4 371
16.13 在會話間同步shell歷史記錄 373
16.14 設置shell的歷史選項 374
16.15 創建更好的cd命令 376
16.16 一次性創建並切換到新目錄 378
16.17 直達底部 379
16.18 用可裝載的內建命令為bash添加新特性 380
16.19 改善可編程補全 385
16.20 正確使用初始化文件 389
16.21 創建自包含的可移植rc文件 392
16.22 自定義配置入門 394

第 17 章 內務及管理任務 407
17.1 批量重命名文件 407
17.2 在Linux中使用GUN Texinfo和info 409
17.3 批量解壓ZIP文件 410
17.4 用screen恢復斷開的會話 411
17.5 共享單個bash會話 413
17.6 記錄整個會話或批量作業 414
17.7 註銷時清除屏幕 415
17.8 獲取用於數據恢復的文件元數據 416
17.9 為多個文件創建索引 417
17.10 使用diff和patch 418
17.11 統計文件間存在多少差異 421
17.12 刪除或重命名名稱中包含特殊字符的文件 423
17.13 將數據追加到文件開頭 424
17.14 就地編輯文件 427
17.15 將sudo應用於一組命令 429
17.16 查找僅出現在一個文件中的行 431
17.17 保留最近的N個對象 433
17.18 寫入循環日誌 436
17.19 循環備份 438
17.20 搜索不包含grep進程自身在內的ps輸出 440
17.21 確定某個進程是否正在運行 441
17.22 為輸出添加前綴或後綴 443
17.23 對行進行編號 444
17.24 生成序列 446
17.25 模擬DOS的pause命令 448
17.26 為數值添加逗號 449

第 18 章 寫得少,乾得快 451
18.1 在任意目錄之間快速移動 451
18.2 重復上一個命令 453
18.3 執行類似命令 454
18.4 快速替換 455
18.5 參數重用 456
18.6 名稱補全 457
18.7 安全第 一 458
18.8 修改多個命令 459

第 19 章 竅門與陷阱:新手常見錯誤 461
19.1 忘記設置可執行權限 461
19.2 修復“No such file or directory”錯誤 462
19.3 忘記當前目錄不在$PATH中 463
19.4 將腳本命名為test 465
19.5 試圖修改已導出的變量 465
19.6 賦值時忘記加引號 467
19.7 忘記模式匹配的結果是按字母順序排列的 468
19.8 忘記管道會產生子shell 469
19.9 使終端恢復正常 471
19.10 用空變量刪除文件 472
19.11 printf的怪異行為 473
19.12 測試bash腳本語法 475
19.13 調試腳本 475
19.14 使用函數時避免出現“command not found”錯誤 477
19.15 混淆了shell通配符和正則表達式 478
附錄A 參考 481
附錄B bash自帶的示例 513
附錄C 命令行處理 523
附錄D 修訂控制 528
附錄E 從源代碼構建bash 552
關於作者 557
關於封面 557