一、Shell 腳本簡介
1. 定義
Shell 是用戶與操作系統內核交互的橋梁,常見類型有 Bash、Zsh、PowerShell 等。Shell 腳本則是一系列 Shell 命令的集合,通常保存為后綴為.sh 的文本文件。
2. 作用
類別 | 描述 |
---|---|
自動化重復性任務 | 例如定期備份數據、執行定時任務,可極大節省人力與時間。 |
系統配置管理 | 能夠高效地對系統各項參數進行配置與調整。 |
測試腳本開發 | 助力軟件測試流程,確保軟件質量。 |
數據處理流水線 | 實現數據自動化處理,提升數據處理效率。 |
二、Shell 腳本基礎結構
1. 基本格式
#!/bin/bash # 指定解釋器為 Bash
echo "Hello World!" # 輸出文本
#!/bin/bash
這行代碼指定該腳本使用 Bash 解釋器執行,echo "Hello World!"
是一個簡單的輸出命令,用于在終端顯示指定字符串。
2. 執行方式
2.1 賦予執行權限
使用chmod +x script.sh
命令為腳本賦予可執行權限。
2.2 執行腳本
通過./script.sh
執行已賦予權限的腳本。
三、Shell 腳本常用命令與語法
1. 基礎語法
1.1 Hello World
#!/bin/bash
echo "Hello World" # 輸出字符串
這是 Shell 腳本的入門示例,echo
命令用于在終端輸出文本信息。
1.2 變量賦值與輸出
#!/bin/bash
name="Alice" # 變量賦值(無需類型聲明)
age=25
echo "Name: $name, Age: $age" # 變量通過 $ 符號引用
在 Shell 腳本中變量賦值簡單直接,無需聲明變量類型。通過$
符號引用變量,實現變量值輸出。
1.3 注釋
#!/bin/bash
# 單行注釋:使用#符號
: '多行注釋通過: '和' '包裹實現
'
單行注釋以#
開頭,用于對單行代碼解釋說明。多行注釋通過: '
和' '
將注釋內容包裹,適合對復雜邏輯塊說明,增強腳本可讀性。
2. 流程控制
2.1 條件判斷(if 語句)
#!/bin/bash
num=10
if [ $num -gt 5 ]; then # -gt表示大于echo "Number is greater than 5"
elseecho "Number is less than or equal to 5"
fi
if
語句通過判斷條件決定執行不同代碼塊。使用[ ]
進行條件判斷時,注意[ ]
內符號與變量間需保留空格。同時支持-eq
(等于)、-lt
(小于)等多種比較操作符。
2.2 case 語句
#!/bin/bash
day=3
case $day in1) echo "Monday" ;;2) echo "Tuesday" ;;3) echo "Wednesday" ;;*) echo "Unknown day" ;;
esac
case
語句基于模式匹配實現多分支邏輯。根據變量值與不同模式匹配,執行相應代碼塊,*
用于匹配其他未列出情況。
3. 循環結構
3.1 for 循環
#!/bin/bash
# 遍歷數字序列
for i in {1..5}; doecho "Counter: $i"
done# 遍歷數組
fruits=("Apple" "Banana" "Orange")
for fruit in "${fruits[@]}"; doecho "I like $fruit"
done
for
循環可用于遍歷數字范圍、字符串列表以及數組。通過設置不同遍歷對象,實現對一系列元素的重復操作。
3.2 while 循環
#!/bin/bash
count=1
while [ $count -le 5 ]; doecho "Loop: $count"((count++)) # 算術運算
done
while
循環適用于在條件滿足時重復執行代碼塊,常用于循環次數不確定的場景。使用時要注意設置正確的循環終止條件,避免死循環。
4. 文件與輸入處理
4.1 用戶輸入
#!/bin/bash
echo -n "Enter your name: " # -n禁止自動換行
read name
echo "Welcome, $name!"
read
命令用于讀取用戶在終端的輸入。通過echo -n
輸出提示信息,且-n
選項可防止echo
自動換行,以便用戶在同一行輸入內容。
4.2 文件操作
#!/bin/bash
# 創建文件并寫入內容
echo "Hello" > output.txt# 逐行讀取文件
while IFS= read -r line; doecho "Line: $line"
done < input.txt
在文件操作中,>
用于將輸出內容覆蓋寫入文件,>>
則是追加寫入。通過<
實現輸入重定向,可從文件中讀取內容。上述示例展示了創建文件并寫入內容,以及逐行讀取文件內容的操作。
5. 進階技巧
5.1 函數定義
#!/bin/bash
# 定義函數
greet() {echo "Hello, $1!" # $1表示第一個參數
}# 調用函數
greet "Bob"
函數可以將重復使用的代碼邏輯封裝起來,提高代碼復用性。通過$1
,?$2
等方式傳遞參數,實現函數的靈活調用。
5.2 錯誤處理
#!/bin/bash
set -e # 遇到錯誤立即退出# 檢查文件是否存在
if [ ! -f "data.txt" ]; thenecho "File not found!" >&2 # 輸出到標準錯誤exit 1
fi
set -e
命令可使腳本在遇到錯誤時立即退出,增強腳本健壯性。通過>&2
將錯誤信息輸出到標準錯誤流,同時使用exit 1
表示腳本因錯誤而退出。
四、常用 Shell 命令分類
1. 文件與目錄操作
命令 | 功能描述 |
---|---|
ls | 列出目錄內容 |
cd | 切換目錄 |
pwd | 顯示當前目錄路徑 |
mkdir | 創建目錄 |
rm | 刪除文件或目錄 |
cp | 復制文件或目錄 |
mv | 移動 / 重命名文件或目錄 |
find | 在目錄樹中搜索文件 |
2. 文本處理
命令 | 功能描述 |
---|---|
cat | 查看、連接或創建文本文件 |
grep | 在文件中搜索匹配模式 |
sed | 流編輯器,用于文本替換、刪除、查找等 |
awk | 強大的文本分析工具 |
head/tail | 顯示文件開頭或結尾部分 |
grep "error" log.txt # 查找包含 "error" 的行
sed 's/foo/bar/' file.txt # 將 file.txt 中所有 "foo" 替換為 "bar"
五、常見 Shell 調試技巧
1. 調試選項
1.1 bash -x script.sh
顯示腳本的執行步驟,方便定位錯誤發生位置。
1.2 set -v
顯示腳本中每一條命令,有助于了解腳本執行流程。
1.3 set -e
使腳本在遇到錯誤時立即退出,避免錯誤進一步擴散。
2. 輸入輸出重定向
2.1 command > output.txt
將命令的輸出寫入文件,會覆蓋原有文件內容。
2.2 command >> output.txt
將命令的輸出追加到文件末尾,保留原有文件內容。
2.3 command < input.txt
將文件作為命令的輸入來源。
六、實戰示例:文件統計工具
#!/bin/bash
# 統計文件行數、單詞數和字符數
file=$1if [ -z "$file" ]; thenecho "Usage: $0 <filename>"exit 1
filines=$(wc -l < "$file")
words=$(wc -w < "$file")
chars=$(wc -m < "$file")echo "Lines: $lines"
echo "Words: $words"
echo "Characters: $chars"
該示例結合條件判斷、文件操作以及外部命令,實現一個簡單實用的文件統計工具。通過檢查輸入參數是否為空,確保腳本正確運行,并利用wc
命令統計文件的行數、單詞數和字符數。
整理不易,誠望各位看官點贊 收藏 評論 予以支持,這將成為我持續更新的動力源泉。若您在閱覽時存有異議或建議,敬請留言指正批評,讓我們攜手共同學習,共同進取,吾輩自當相互勉勵!?
后續可以從簡單的命令如echo
、if
語句開始練習,逐步掌握循環、函數等較為復雜的語法結構。用bash -x script.sh
等調試選項,幫助理解腳本的執行過程,快速定位和解決問題。