目錄
1. Shell腳本概述
什么是Shell?
Shell的作用
常見的Shell類型
2. 環境搭建與安裝
Linux系統
macOS系統
Windows系統
3.安裝并配置Zsh(macOS/Linux)
4. Shell基礎語法
變量與數據類型
輸入交互
5. Shell腳本進階
進程管理
錯誤處理與調試
6. Shell腳本實戰案例(擴展)
日志分析工具
批量重命名文件
7.流程圖說明
Shell腳本執行流程
自動化備份流程
8. 疑難問題與解決方案(擴展)
跨平臺路徑問題
性能優化示例
7. Shell腳本的維護與優化(擴展)
單元測試示例
8. Shell在DevOps中的應用(擴展)
Docker容器管理腳本
完整實戰項目:服務器健康檢查工具
1. Shell腳本概述
什么是Shell?
Shell是用戶與操作系統內核之間的接口,負責解析用戶輸入的命令并執行。它既是一個命令行解釋器,也是一種腳本語言,能夠通過編寫腳本實現復雜的自動化任務。
Shell的作用
-
系統管理:批量處理文件、用戶權限管理、服務監控。
-
自動化運維:日志切割、備份恢復、軟件部署。
-
開發輔助:編譯構建、測試環境搭建、數據預處理。
常見的Shell類型
-
Bash(Bourne-Again Shell):Linux默認Shell,功能強大。
-
Zsh(Z Shell):支持插件和主題,適合交互式使用。
-
Ksh(Korn Shell):兼容Bash,適合企業級腳本。
2. 環境搭建與安裝
Linux系統
-
默認已安裝Bash,通過
echo $SHELL
查看當前Shell。 -
切換Shell:
chsh -s /bin/zsh
。
macOS系統
-
默認使用Zsh(Catalina及以后版本),舊版為Bash。
-
安裝Bash:
brew install bash
。
Windows系統
3.安裝并配置Zsh(macOS/Linux)
-
WSL(Windows Subsystem for Linux):直接運行Linux環境。
-
Cygwin:提供類Unix環境的模擬器。
-
?啟用WSL功能:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
-
安裝Ubuntu:
-
從Microsoft Store下載Ubuntu發行版。
-
啟動并設置用戶名/密碼。
-
-
安裝Zsh:
sudo apt update && sudo apt upgrade -y
-
設置為默認Shell:
chsh -s $(which zsh)
-
安裝Oh My Zsh:
chsh -s $(which zsh)
-
更新系統:
sudo apt update && sudo apt upgrade -y
4. Shell基礎語法
變量與數據類型
#!/bin/bash
# 環境變量 vs 局部變量
global_var="Global" # 當前Shell進程有效
function test_vars() {local local_var="Local" # 僅在函數內有效echo "函數內: $global_var, $local_var"
}
test_vars
echo "函數外: $global_var, $local_var" # 輸出: 函數外: Global, (空)
輸入交互
#!/bin/bash
# 讀取用戶輸入并驗證
read -p "請輸入用戶名: " username
if [ -z "$username" ]; thenecho "用戶名不能為空!"exit 1
fi
echo "歡迎, $username!"
5. Shell腳本進階
進程管理
#!/bin/bash
# 后臺運行進程并記錄PID
nohup python3 app.py > app.log 2>&1 &
echo "應用已啟動,PID: $!"# 根據PID終止進程
kill -9 $!
錯誤處理與調試
#!/bin/bash
set -euo pipefail # 嚴格模式:錯誤退出、未定義變量報錯、管道錯誤檢測
trap 'echo "腳本被中斷!"; exit 1' INT TERM # 捕獲中斷信號# 模擬錯誤
invalid_command
echo "此行不會執行"
6. Shell腳本實戰案例(擴展)
日志分析工具
#!/bin/bash
# 統計Nginx日志中狀態碼為404的請求
logfile="/var/log/nginx/access.log"
output="404_errors.csv"echo "時間,客戶端IP,請求路徑" > $output
grep ' 404 ' $logfile | awk '{print $4","$1","$7}' >> $output
echo "分析完成,結果保存至 $output"
批量重命名文件
#!/bin/bash
# 將目錄下所有.txt文件按日期重命名
counter=1
for file in *.txt; donew_name=$(date +%Y%m%d)_${counter}.txtmv "$file" "$new_name"((counter++))
done
7.流程圖說明
Shell腳本執行流程
graph TDA[編寫腳本] --> B[添加Shebang]B --> C[賦予執行權限 chmod +x]C --> D[執行腳本 ./script.sh]D --> E{是否錯誤?}E -- 是 --> F[調試代碼]E -- 否 --> G[輸出結果]
自動化備份流程
graph LRA[開始] --> B[檢查備份目錄是否存在]B -- 不存在 --> C[創建目錄]B -- 存在 --> D[壓縮源目錄]D --> E[生成帶時間戳的備份文件]E --> F[驗證備份完整性]F -- 成功 --> G[發送成功通知]F -- 失敗 --> H[告警管理員]G --> I[結束]H --> I
8. 疑難問題與解決方案(擴展)
跨平臺路徑問題
-
問題:Windows與Linux路徑斜杠(
\
?vs?/
)不兼容。 -
解決:在腳本中使用
${var//\\//}
轉換路徑格式:win_path="C:\\Users\\demo" unix_path=$(echo $win_path | sed 's/\\/\//g') echo $unix_path # 輸出: C:/Users/demo
性能優化示例
# 避免在循環中頻繁調用外部命令
# 低效寫法
for i in {1..100}; douser_count=$(wc -l users.txt)
done# 高效寫法
user_count=$(wc -l users.txt)
for i in {1..100}; doecho "用戶數: $user_count"
done
7. Shell腳本的維護與優化(擴展)
單元測試示例
#!/bin/bash
# 測試函數:計算兩數之和
function add() {echo $(($1 + $2))
}# 測試用例
function test_add() {result=$(add 3 5)if [ "$result" -eq 8 ]; thenecho "測試通過 ?"elseecho "測試失敗 ?"fi
}test_add
8. Shell在DevOps中的應用(擴展)
Docker容器管理腳本
#!/bin/bash
# 批量清理退出的容器
docker rm $(docker ps -aq -f "status=exited")# 更新所有運行中的容器
docker compose pull && docker compose up -d
完整實戰項目:服務器健康檢查工具
#!/bin/bash
# 功能:檢查CPU、內存、磁盤、服務狀態
# 輸出HTML報告
report="server_health_$(date +%Y%m%d).html"# 生成HTML頭部
echo "<html><body><h1>服務器健康報告</h1><ul>" > $report# 檢查CPU負載
cpu_load=$(uptime | awk -F 'load average:' '{print $2}')
echo "<li>CPU負載: $cpu_load</li>" >> $report# 檢查內存使用
mem_free=$(free -m | awk '/Mem/{print $4}')
echo "<li>剩余內存: ${mem_free}MB</li>" >> $report# 檢查Nginx服務狀態
nginx_status=$(systemctl is-active nginx)
if [ "$nginx_status" = "active" ]; thenecho "<li>Nginx狀態: <span style='color:green;'>運行中</span></li>" >> $report
elseecho "<li>Nginx狀態: <span style='color:red;'>未運行</span></li>" >> $report
fi# 完成報告
echo "</ul></body></html>" >> $report
echo "報告生成完畢: file://$(pwd)/$report"
?