Shell腳本編程

目錄

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類型
  1. Bash(Bourne-Again Shell):Linux默認Shell,功能強大。

  2. Zsh(Z Shell):支持插件和主題,適合交互式使用。

  3. 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"

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76361.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學生管理系統(Python)

運行結果&#xff1a; 源代碼&#xff1a; """ 項目&#xff1a;類似于學生管理系統---增刪改查 """ #封裝一個學生類 import random class Student: def __init__(self,stuid,name,score): self.stuid stuid self.name name self.score …

電商素材革命:影刀RPA魔法指令3.0驅動批量去水印,實現秒級素材凈化

本文 去除水印實操視頻展示電商圖片水印處理的困境?影刀 RPA 魔法指令 3.0 強勢登場?利用魔法指令3.0兩步實現去除水印操作關于影刀RPA 去除水印實操視頻展示 我們這里選擇了4張小紅書里面比較帥氣的圖片&#xff0c;但凡用過小紅書的都知道&#xff0c;小紅書右下角是會有小…

Seq2Seq - GRU補充講解

nn.GRU 是 PyTorch 中實現門控循環單元&#xff08;Gated Recurrent Unit, GRU&#xff09;的模塊。GRU 是一種循環神經網絡&#xff08;RNN&#xff09;的變體&#xff0c;用于處理序列數據&#xff0c;能夠更好地捕捉長距離依賴關系。 ?重點掌握輸入輸出部分輸入張量&#…

設計模式-觀察者模式和發布訂閱模式區別

文章目錄 其他不錯的文章 二者有類似的地方&#xff0c;也有區別。 引用的文章說的已經比較清楚了&#xff0c;這里只列出對比圖。 對比點觀察者模式發布訂閱模式中間人角色無事件中心&#xff0c;觀察者直接訂閱目標有事件中心&#xff0c;發布者與訂閱者通過事件中心通信關系…

【SQL】基于多源SQL 去重方法對比 -- 精華版

【SQL】基于SQL 去重方法對比 -- 精華版 一、引言二、基于SQL去重方法完整對比1. MySQL去重方法及優劣勢1.1 ?DISTINCT關鍵字1.2 GROUP BY子句1.3 UNION系列操作1.4 子查詢 自關聯 2. Hive去重方法及優劣勢2.1 DISTINCT關鍵字2.2 ?GROUP BY子句2.3 ?ROW_NUMBER窗口函數2.4 …

電腦命名配置很高,為什么運行軟件特別卡

估計很多同學都碰見過這種情況&#xff0c;以我的Redmi G為例&#xff0c;I9-14待CPU&#xff0c;又換了一條內存條&#xff0c;現有配置I9-14900&#xff0c;40G內存5200MT/s&#xff0c;4060顯卡&#xff0c;為啥運行兩個辦公軟件就卡的不行&#xff0c;風扇狂轉&#xff0c;…

Spring Boot默認注冊的轉換器列表及其功能說明。這些轉換器使得控制器方法可以直接接收Integer、Long、Date等類型參數,無需手動實現轉換

以下是Spring Boot默認注冊的轉換器列表及其功能說明。這些轉換器使得控制器方法可以直接接收Integer、Long、Date等類型參數&#xff0c;無需手動實現轉換&#xff1a; 默認轉換器列表及功能 1. 基礎類型轉換器 轉換器名稱功能示例場景StringToIntegerConverter將字符串轉換…

chrome提示https不安全, 不能記住賬號密碼怎么辦? 可以利用js輸入賬號

背景: 在內網搭建的服務, 由于https證書問題, 可能會被chrome瀏覽器提示不安全 此時, 默認的記住賬號密碼功能就無法使用, 那么此時只能手動輸入了嗎? 想到了幾種方案 1.利用外置軟件, 模擬按鍵輸入(比如按鍵精靈, 缺點是依賴外部軟件, 運行速度也慢, 且執行時占用了輸入焦…

探秘Transformer系列之(25)--- KV Cache優化之處理長文本序列

探秘Transformer系列之&#xff08;25&#xff09;— KV Cache優化之處理長文本序列 文章目錄 探秘Transformer系列之&#xff08;25&#xff09;--- KV Cache優化之處理長文本序列0x00 概述0x01 優化依據1.1 稀疏性1.2 重要性1.3 小結 0x02 稀疏化1.1 分類1.2 靜態稀疏化1.2.1…

【開發經驗】結合實際問題解決詳述HTTPS通信過程

最近的開發調試過程中涉及到了HTTPS發送與接收&#xff0c;遇到實際問題才發現對這部分尚屬于一知半解。結合實際問題的解決過程來詳細整理以下HTTPS通信過程。 需要調試的功能為BMC作為客戶端向搭建好的Web服務器發送HTTPS請求&#xff0c;Web服務器負責接收處理發送過來的HT…

【Android】Android Activity 橫屏設置詳解及常見異常問題解決方法匯總

在 Android 開發中&#xff0c;我們經常需要控制 Activity 的屏幕方向&#xff0c;例如視頻播放、游戲、VR/AR 應用等場景通常希望默認橫屏顯示。本文將講解如何通過 Manifest 配置 和 Java/Kotlin 代碼 設置橫屏顯示&#xff0c;并分析常見設置無效的原因與解決方法。 一、通過…

文件相關:echo重定向管道命令擴展詳解

一、echo 文字內容 echo 會在終端中顯示參數指定的文字&#xff0c;通常會和 重定向 聯合使用 二、重定向 > 和 >> Linux 允許將命令執行結果 重定向到一個 文件將本應顯示在終端上的內容 輸出 / 追加 到指定文件中 其中&#xff1a; >表示輸出&#xff0c;會覆…

Python 中使用單例模式

有這么一種場景&#xff0c;Web服務中有一個全局資源池&#xff0c;在需要使用的地方就自然而言引用該全局資源池即可&#xff0c;此時可以將該資源池以單例模式實現。隨后&#xff0c;需要為某一特殊業務場景專門準備一個全局資源池&#xff0c;于是額外復制一份代碼新建了一個…

websocket深入-webflux+websocket

文章目錄 背景版本約定配置文件代碼使用webflux使用websocket配置文件handler基類實現類注冊路由 背景 基于更復雜的情況和更高的開發要求&#xff0c;我們可能會遇到必須同時要使用webflux和websocket的情況。 版本約定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…

致遠OA —— 表單數據獲取(前端)

文章目錄 :apple: 業務需求描述 &#x1f34e; 業務需求描述 測試案例&#xff1a; https://pan.quark.cn/s/3f58972f0a27 官網地址&#xff1a; 需求描述&#xff1a; 點擊獲取數據接口&#xff0c;調用后臺&#xff0c;將從后臺查詢到的數據回寫到表單的內容中。 如下…

51c嵌入式~繼電器~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/13775821 一、繼電器應用細節 繼電器的應用&#xff0c;相信大家都知道&#xff0c;在電路中只要給它供電、斷電也就可以工作了。本文討論它的應用細節。 現在流行的接法 圖中&#xff0c;繼電器的線圈經過Q1作為開關&am…

前端性能優化核彈級方案:CSS分層渲染+Wasm,首屏提速300%!

前端性能優化核彈級方案&#xff1a;CSS分層渲染Wasm實現首屏提速300%的終極指南 在當今Web應用日益復雜的背景下&#xff0c;性能優化已成為前端開發的核心競爭力。本文將深入剖析兩種革命性的前端性能優化技術——CSS分層渲染與WebAssembly(Wasm)的協同應用&#xff0c;揭示…

初識Redis · 簡單理解Redis

目錄 前言&#xff1a; 分布式系統 開源節流 認識Redis 負載均衡 緩存 微服務 前言&#xff1a; 本文只是作為Redis的一篇雜談&#xff0c;簡單理解一下Redis為什么要存在&#xff0c;以及它能做到和它不能做到的事兒&#xff0c;簡單提及一下它對應的優勢有什么&#…

網絡通訊協議UDP轉發TCP工具_UdpToTcpRelay_雙向版

UDP/TCP網絡轉發器程序說明書 1. 程序概述 本程序是一個高性能網絡數據轉發工具&#xff0c;支持UDP和TCP協議之間的雙向數據轉發&#xff0c;并具備以下核心功能&#xff1a; 協議轉換&#xff1a;實現UDP?TCP協議轉換數據轉換&#xff1a;支持十六進制/ASCII格式的數據轉…

MCP 服務搭建與配置學習資源部分匯總

MCP 服務搭建與配置學習資源匯總 目錄 圖文教程GitHub 示例項目視頻課程不同開發語言實現案例 圖文教程 Cherry Studio 配置 MCP 服務教程 – 介紹如何在 Cherry Studio 客戶端中配置 MCP 服務器&#xff0c;讓 AI 模型能夠自主調用本地/網絡工具來完成任務&#xff0c;提升…