一、前言
在 Linux Shell 腳本編程中,for
循環 是最常用的控制結構之一,用于重復執行一段命令,特別適用于處理列表、文件、數字序列等場景。
本文將詳細介紹 Shell 腳本中 for
循環的各種語法結構,包括:
? 經典 for in
結構
? C 風格 for
循環
? 遍歷命令輸出
? 實際應用場景
? 常見錯誤與調試技巧
無論你是剛接觸 Shell 腳本的新手,還是希望鞏固基礎的開發者,這篇文章都能為你提供實用的知識點。
二、Shell 中 for 循環的基本語法
Shell 腳本中的 for
循環主要有兩種寫法:
1.?for ... in ...
?結構(最常用)
for 變量 in 列表
do命令1命令2...
done
或簡寫為一行(注意分號):
for 變量 in 列表; do 命令; done
? 說明:
變量
:每次循環中取列表中的一個值;列表
:可以是字符串、數字、命令輸出、通配符等;do
?和?done
?之間是循環體。
2. C 風格 for 循環(類 C 語言語法)
for (( 初始值; 條件; 步長 ))
do命令
done
適用于需要計數、遞增/遞減的場景。
三、for 循環的常見用法與示例
1. 遍歷字符串列表
#!/bin/bashfor fruit in apple banana orange
doecho "我喜歡吃: $fruit"
done
輸出:
我喜歡吃: apple
我喜歡吃: banana
我喜歡吃: orange
2. 遍歷數字序列
方法一:使用?seq
?命令
for i in $(seq 1 5)
doecho "數字: $i"
done
方法二:使用花括號?{}
for i in {1..10..2} # 1 到 10,步長為 2
doecho "奇數: $i"
done
輸出:1, 3, 5, 7, 9
3. C 風格 for 循環(推薦用于數值計算)
for (( i=1; i<=5; i++ ))
doecho "計數: $i"
done
? 優點:語法清晰,適合復雜循環邏輯。
4. 遍歷文件或目錄
for file in *.txt
doif [ -f "$file" ]; thenecho "找到文本文件: $file"fi
done
? 說明:
*.txt
會匹配當前目錄下所有.txt
文件。
5. 遍歷命令輸出結果
使用 $()
或反引號執行命令,并將結果作為列表:
for user in $(who | awk '{print $1}' | sort -u)
doecho "當前登錄用戶: $user"
done
?? 注意:如果輸出包含空格或特殊字符,建議使用
while read
更安全。
6. 遍歷數組元素
fruits=("apple" "banana" "orange")
for fruit in "${fruits[@]}"
doecho "水果: $fruit"
done
? 推薦使用
"${array[@]}"
防止空格問題。
四、進階技巧與最佳實踐
1. 在一行中寫 for 循環(命令行常用)
for i in {1..3}; do echo "Hello $i"; done
非常適合快速測試或臨時任務。
2. 使用?break
?和?continue
break
:跳出整個循環;continue
:跳過本次循環,進入下一次;
for i in {1..5}
doif [ $i -eq 3 ]; thencontinue # 跳過 3fiif [ $i -gt 4 ]; thenbreak # 大于 4 就退出fiecho "i = $i"
done
輸出:
i = 1
i = 2
i = 4
3. 嵌套 for 循環
for i in {1..2}
dofor j in {a,b}doecho "組合: $i$j"done
done
輸出:
組合: 1a
組合: 1b
組合: 2a
組合: 2b
五、常見問題與注意事項
問題 | 原因 | 解決方法 |
---|---|---|
報錯:command not found | 語法錯誤或缺少?do/done | 檢查語法是否完整 |
空格導致解析錯誤 | 變量未加引號 | 使用?"$var" ?包裹變量 |
遍歷文件名含空格失敗 | 未正確引用 | 使用?while read ?或加引號 |
seq ?命令不可用 | 某些系統未安裝 | 改用?{1..10} ?或?C 風格 |
中文亂碼 | 編碼問題 | 設置?LANG=en_US.UTF-8 ?或使用 UTF-8 編碼保存腳本 |
六、總結對比表
寫法 | 適用場景 | 是否推薦 | 說明 |
---|---|---|---|
for i in list | 字符串、文件、命令輸出 | ? | 最常用 |
for i in {1..10} | 數字序列 | ? | 簡潔高效 |
for i in $(seq ...) | 兼容舊系統 | ?? | 可讀性稍差 |
for ((...)) | 數值計算、計數 | ? | 類 C 風格,邏輯清晰 |
for var in "${array[@]}" | 遍歷數組 | ? | 安全且標準 |
for output in $(cmd) | 命令輸出 | ?? | 注意空格和特殊字符 |
七、結語
感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!