Shell 腳本編程全面學習指南

前言

Shell 腳本編程是 Linux 和 Unix 系統管理、自動化任務的核心工具之一。通過 Shell 腳本,你可以自動化重復性操作、簡化復雜流程、提高系統管理效率,甚至構建完整的自動化運維工具。本文將帶你從基礎到進階,全面學習 Shell 腳本編程,涵蓋語法、結構、調試、最佳實踐等內容。


一、Shell 簡介與環境搭建

1.1 什么是 Shell?

Shell 是命令行解釋器,是用戶與操作系統內核之間的橋梁。它接收用戶輸入的命令,并調用相應的程序或服務來執行。

常見的 Shell 有:

  • Bash(Bourne-Again Shell):Linux 系統默認的 Shell,廣泛使用。
  • sh(Bourne Shell):早期的 Unix Shell,兼容性好。
  • zsh(Z Shell):功能更強大、交互性更強的現代 Shell。
  • PowerShell:Windows 和跨平臺環境下使用的 Shell,語法不同但功能類似。

本文以 Bash 為例進行講解。

1.2 環境準備

在 Linux 或 macOS 系統中,Bash 通常已經預裝。可以通過以下命令查看當前 Shell:

echo $SHELL

如果你使用的是 Windows,可以安裝:

  • Windows Subsystem for Linux (WSL):推薦使用 WSL2,支持完整的 Linux 環境。
  • Git Bash:輕量級的 Bash 環境,適合開發人員。

二、第一個 Shell 腳本

2.1 編寫腳本

創建一個名為 hello.sh 的文件:

#!/bin/bash
# 這是我的第一個 Shell 腳本echo "Hello, World!"

2.2 執行腳本

給腳本添加執行權限:

chmod +x hello.sh

執行腳本:

./hello.sh

2.3 解釋 shebang

#!/bin/bash 被稱為 shebang,用于告訴系統該腳本應使用哪個解釋器來執行。不同的 shebang 可以指定不同的 Shell,例如:

  • #!/bin/sh:使用 Bourne Shell
  • #!/usr/bin/env python:使用 Python 解釋器運行腳本

三、Shell 腳本基礎語法

3.1 變量定義與使用

Shell 中變量不需要聲明類型,賦值時等號兩側不能有空格:

name="Qwen"
echo "Hello, $name"

可以使用 ${name} 來避免歧義:

echo "Hello, ${name}_user"

3.2 命令替換

將命令的輸出結果賦值給變量:

current_date=$(date)
echo "當前時間是:$current_date"

也可以使用反引號實現相同功能:

current_date=`date`

3.3 輸入輸出操作

讀取用戶輸入:

read -p "請輸入你的名字:" username
echo "你好,$username"

輸出重定向:

echo "Hello" > output.txt     # 覆蓋寫入
echo "World" >> output.txt    # 追加寫入

四、條件判斷與控制結構

4.1 if 語句

age=20
if [ $age -ge 18 ]; thenecho "你已成年"
elseecho "你還未成年"
fi

4.2 比較運算符

運算符含義
-eq等于
-ne不等于
-lt小于
-le小于等于
-gt大于
-ge大于等于

4.3 字符串比較

str1="hello"
str2="world"
if [ "$str1" = "$str2" ]; thenecho "字符串相等"
elseecho "字符串不相等"
fi

4.4 case 語句

case $1 instart)echo "啟動服務";;stop)echo "停止服務";;*)echo "未知命令";;
esac

五、循環結構

5.1 for 循環

for i in {1..5}; doecho "第 $i 次循環"
done

遍歷數組:

names=("Alice" "Bob" "Charlie")
for name in "${names[@]}"; doecho "Hello, $name"
done

5.2 while 循環

count=1
while [ $count -le 5 ]; doecho "計數:$count"count=$((count + 1))
done

5.3 until 循環(直到條件為真)

count=1
until [ $count -gt 5 ]; doecho "計數:$count"count=$((count + 1))
done

六、函數與模塊化編程

6.1 定義函數

greet() {echo "你好,$1"
}greet "Alice"
greet "Bob"

6.2 返回值與局部變量

add() {local result=$(( $1 + $2 ))echo $result
}sum=$(add 3 5)
echo "3 + 5 = $sum"

6.3 函數參數傳遞

函數參數通過 $1, $2, ... 傳遞:

log() {echo "[$(date +%H:%M:%S)] $1"
}log "腳本開始執行"

七、數組與集合操作

7.1 定義數組

fruits=("apple" "banana" "cherry")

7.2 訪問數組元素

echo "第一個水果是:${fruits[0]}"
echo "所有水果是:${fruits[@]}"

7.3 遍歷數組

for fruit in "${fruits[@]}"; doecho "$fruit"
done

7.4 數組操作

  • 添加元素:
fruits+=("orange")
  • 刪除元素:
unset fruits[1]
  • 獲取數組長度:
echo "水果數量:${#fruits[@]}"

八、腳本參數與退出狀態

8.1 獲取腳本參數

echo "腳本名稱:$0"
echo "第一個參數:$1"
echo "所有參數:$@"
echo "參數個數:$#"

8.2 退出狀態碼

腳本的退出狀態碼用于表示執行是否成功:

exit 0   # 成功
exit 1   # 錯誤

可以通過 $? 獲取上一個命令的退出狀態:

ls /nonexistent
echo "上一個命令的狀態碼:$?"

九、文件與目錄操作

9.1 文件測試

if [ -f "file.txt" ]; thenecho "文件存在"
fi

常見測試操作符:

操作符含義
-f是否為文件
-d是否為目錄
-r是否可讀
-w是否可寫
-x是否可執行

9.2 文件操作示例

  • 創建文件:
touch newfile.txt
  • 刪除文件:
rm -f file.txt
  • 移動/重命名文件:
mv oldname.txt newname.txt
  • 查看文件內容:
cat file.txt

十、調試與優化腳本

10.1 調試腳本

使用 -x 參數調試腳本:

bash -x script.sh

或者在腳本開頭加上:

set -x

關閉調試:

set +x

10.2 腳本優化技巧

  • 使用?set -u?防止使用未定義變量。
  • 使用?set -e?在出現錯誤時立即退出腳本。
  • 使用?trap?捕獲信號,進行清理操作:
trap "echo '腳本被中斷'; exit 1" INT
  • 使用?getopts?解析命令行參數:
while getopts "a:b:c" opt; docase $opt ina)echo "選項 a 的值:$OPTARG";;b)echo "選項 b 的值:$OPTARG";;c)echo "選項 c 被設置";;\?)echo "無效選項:-$OPTARG";;esac
done

十一、實戰項目:自動化備份腳本

#!/bin/bash# 設置變量
backup_dir="/backup"
source_dir="/home/user/documents"
timestamp=$(date +%Y%m%d%H%M%S)
backup_file="$backup_dir/backup_$timestamp.tar.gz"# 創建備份目錄(如果不存在)
mkdir -p $backup_dir# 執行備份
tar -czf $backup_file $source_dir# 檢查是否成功
if [ $? -eq 0 ]; thenecho "備份完成:$backup_file"
elseecho "備份失敗"exit 1
fi

十二、高級主題與最佳實踐

12.1 使用正則表達式

if [[ "hello123" =~ ^[a-zA-Z0-9]+$ ]]; thenecho "匹配成功"
fi

12.2 使用關聯數組(Bash 4+)

declare -A user_info
user_info["name"]="Alice"
user_info["age"]=25
echo "用戶姓名:${user_info[name]}"

12.3 使用子 Shell

(cd /tmptouch testfile
)

12.4 使用 Here Document

cat << EOF > output.txt
這是第一行
這是第二行
EOF

12.5 使用別名與函數庫

可以將常用函數放入一個 .sh 文件中作為庫文件:

# utils.sh
log() {echo "[$(date +%H:%M:%S)] $1"
}

在主腳本中引用:

source utils.sh
log "腳本開始執行"

?

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

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

相關文章

DelayQueue延遲隊列的使用

1、DelayQueue簡介 DelayQueue 也是 Java 并發包&#xff08;java.util.concurrent&#xff09;中的一個特殊隊列,用于在指定的延遲時間之后處理元素。 DelayQueue的一些關鍵特性&#xff1a; 延遲元素處理&#xff1a;只有當元素的延遲時間到期時&#xff0c;元素才能被取出…

QT6 源,七章對話框與多窗體(6) 顏色對話框 QColorDialog :本類的屬性,信號函數,靜態成員函數,以及源代碼

&#xff08;1&#xff09;本類的繼承關系如下 &#xff1a;&#xff08;2&#xff09; 對于本標準顏色對話框來講&#xff0c;學會使用其靜態函數以獲取到顏色就足夠了。&#xff08;3&#xff09; 開始學習本類的靜態成員函數 &#xff1a;&#xff08;4&#xff09;測試一下…

金倉數據庫:融合進化,智領未來——2025年數據庫技術革命的深度解析

引言 在數字中國戰略的推動下&#xff0c;數據庫作為數字經濟的基礎設施&#xff0c;正經歷著前所未有的技術重構。2025年7月15日&#xff0c;電科金倉以"融合進化&#xff0c;智領未來"為主題&#xff0c;發布了新一代數據庫產品矩陣&#xff0c;標志著國產數據庫在…

【人工智能99問】卷積神經網絡(CNN)的結構和原理是什么?(10/99)

文章目錄卷積神經網絡&#xff08;CNN&#xff09;的結構及原理一、CNN的核心結構1. 輸入層&#xff08;Input Layer&#xff09;2. 卷積層&#xff08;Convolutional Layer&#xff09;2. 卷積層的核心機制&#xff1a;局部感受野與權值共享3. 池化層&#xff08;Pooling Laye…

CCF編程能力等級認證GESP—C++7級—20250628

CCF編程能力等級認證GESP—C7級—20250628單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;判斷題&#xff08;每題 2 分&#xff0c;共 20 分&#xff09;編程題 (每題 25 分&#xff0c;共 50 分)線圖調味平衡單選題&#xff08;每題 2 分&#xff0c;共 30 分&…

《Python 類設計模式:屬性分類(類屬性 VS 實例屬性)與方法類型(實例 / 類 / 靜態)詳解》

Python 類和對象&#xff1a;從 "圖紙" 到 "實物" 的編程思維面向對象編程&#xff08;Object-Oriented Programming&#xff0c;簡稱OOP &#xff09;是一種通過組織對象來編程的方法。1.初識類和對象&#xff1a;用生活例子看透核心概念1.1類-class物與類…

Eureka服務端啟動

目錄 1、相關文章 2、創建eureka-server子工程 3、父工程build.gradle引入版本依賴管理 4、子工程build.gradle引入依賴 5、將main重命名為EurekaApplication并修改代碼 6、添加application.yml文件 7、啟動工程并訪問 8、訪問界面如下 9、 完整目錄結構 1、相關文章 …

AWS Partner: Sales Accreditation (Business)

AWS Partner: Sales Accreditation &#xff08;Business&#xff09;云概念和AWS云計算什么是云計算&#xff1f;計算的演變趨勢云計算部署模型AWS 客戶采用的模式為什么客戶選擇AWSAWS競爭優勢高可用的全球基礎設施AWS服務服務廣度和深度AWS產品和服務服務類別AWS解決方案庫A…

深入理解設計模式之中介者模式:解耦對象交互的利器

為什么需要中介者&#xff1f;在軟件開發中&#xff0c;我們經常會遇到對象之間需要相互通信的場景。當系統規模較小時&#xff0c;對象直接相互引用并通信可能不會帶來太大問題。但隨著系統復雜度增加&#xff0c;對象間的交互關系會變得錯綜復雜&#xff0c;形成一個復雜的網…

從 0 安裝 Label Studio:搭建可后臺運行的數據標注平臺(systemd 實踐

本文將介紹如何使用 pip 安裝 Label Studio&#xff0c;并通過 systemd 實現開機自啟與后臺運行&#xff0c;適用搭建個人項目的數據標注平臺。 一、Label Studio 簡介 Label Studio 是一個開源、跨模態的數據標注工具&#xff0c;支持文本、圖像、音頻、視頻、HTML等多種類型…

【數據結構】鏈表(linked list)

目錄 一、鏈表的介紹 二、單鏈表 1. 單鏈表的初始化 2. 單鏈表的插入 &#xff08;1&#xff09;動態申請一個節點 &#xff08;2&#xff09;頭插法 &#xff08;3&#xff09;尾插法 &#xff08;4&#xff09;按照位置來插入 &#xff08;5&#xff09;在地址之前插…

反序列化漏洞1-PHP序列化基礎概念(0基礎超詳細)

一.PHP序列化基礎概念首先當我們看到反序列化漏洞這個概念&#xff0c;我們的第一個問題是什么是反序列化&#xff1f;那么我們要知道什么是反序列化就要知道什么是序列化。序列化就是可以將一個對象壓縮并格式化成字符串&#xff0c;可以將該對象保存下來&#xff0c;以便存儲…

【微服務】Ocelot微服務網關

目錄 一、目的 二、Ocelot介紹 三、.Net中使用Ocelot搭建網關服務 3.1 搭建網關Ocelot步驟 3.1.1、創建Net7 WebApi服務 3.1.2、Nuget引入-Ocelot程序包&#xff08;版本&#xff1a;19.0.2&#xff09; 3.1.3、配置中間件和IOC注冊 3.1.4 配置文件編輯Ocelot網關配置信…

零基礎入門:用按鍵精靈實現視頻自動操作(附完整腳本)

摘要&#xff1a;本文手把手教你編寫視頻平臺的自動化腳本&#xff0c;涵蓋點擊、循環、防檢測等核心技巧&#xff0c;無需編程基礎&#xff0c;輕松實現自動播放/點贊/跳過廣告。&#xff08;使用按鍵精靈2024版演示&#xff09; 一、應用場景 自動化操作&#xff1a;自動跳過…

AI(學習筆記第六課) 使用langchain進行AI開發 load documents(csv和文件夾)

文章目錄AI(學習筆記第六課) 使用langchain進行AI開發 load documents(csv和文件夾)學習內容&#xff1a;1.load documents&#xff08;csv&#xff09;1.1 學習url1.2 load csv文件1.2.1 默認load1.2.2 csv文件內容1.2.2 執行csv文件的load1.3 Customizing the CSV parsing an…

企業運維實戰:Jenkins 依賴 JDK21 與應用需 JDK1.8 共存方案(含流水線配置)

前言&#xff1a;在企業運維中&#xff0c;“工具升級”與“業務兼容”的平衡始終是核心挑戰。近期我們遇到一個典型場景&#xff1a;Jenkins 升級到 2.450 版本后&#xff0c;強制要求 JDK21 運行環境&#xff1b;但開發團隊的應用程序因框架依賴&#xff0c;必須使用 JDK1.8 …

爬蟲小知識三:selenium庫

前言 selenium 庫是一種用于 Web 應用程序測試的工具&#xff0c;它可以驅動瀏覽器執行特定操作&#xff0c;自動按照腳本代碼做出單擊、輸入、打開、驗證等操作&#xff0c;支持的瀏覽器包括 IE、Firefox、Safari、Chrome、Opera 等。 與 requests 庫不同的是&#xff0c;se…

Jmeter使用 -1

1 接口測試1.1 為什么要進行接口測試接口測試能夠繞過前端校驗&#xff0c;對后端的接口處理邏輯進行測試&#xff08;數據的邊界/格式/類型&#xff09;在一些需要重復測試的需求中&#xff0c;接口自動化的效率比手工執行效率高1.2 接口測試流程熟悉API接口文檔&#xff08;接…

GitHub 趨勢日報 (2025年07月16日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖2415markitdown570claude-code434ART330erpnext150MusicFree146rustdesk129vanna80…

Python+Tkinter制作音頻格式轉換器

我們將使用Python的Tkinter庫來構建一個音頻格式轉換器界面。由于音頻轉換需要實際的處理&#xff0c;我們將使用pydub庫&#xff08;需要安裝&#xff09;來進行音頻格式轉換。同時&#xff0c;我們會使用ffmpeg作為后端&#xff0c;因此請確保系統中已安裝ffmpeg并添加到環境…