Shell腳本-for循環語法結構

一、前言

在 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)命令輸出??注意空格和特殊字符

七、結語

感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!

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

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

相關文章

記SpringBoot3.x + Thymeleaf 項目實現(MVC架構模式)

目錄 前言 一、創建SpringBoot項目 1. 創建項目 2. 運行項目 二、連接數據庫實現登錄 1. pom.xml文件引入依賴包 2. application.yml文件配置 3. 數據持久層&#xff0c;mybatis操作映射 4. Service接口及實現 5. Controller代碼 6. Thymeleaf頁面登錄 7. 運行項目…

Java 導出word 實現表格內插入圖表(柱狀圖、折線圖、餅狀圖)--可編輯數據

表格內插入圖表導出效果表格內圖表生成流程分析 核心問題與解決方案 問題 Word 圖表作為獨立對象&#xff0c;容易與文本分離位置難以精確控制&#xff0c;編輯時容易偏移缺乏與表格數據的關聯性 解決方案 直接嵌入&#xff1a;將圖表嵌入表格單元格&#xff0c;確保數據關聯精…

北京JAVA基礎面試30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么區別&#xff1f; 1**.COUNT ()**是效率最高的統計方式&#xff1a;COUNT()被優化為常量&#xff0c;直接統計表的所有記錄數&#xff0c;不依賴字段內容&#xff0c;開銷最低。推薦在統計整個表的記錄數時使用。 2.**COUNT(1…

【AI】——結合Ollama、Open WebUI和Docker本地部署可視化AI大語言模型

&#x1f3bc;個人主頁&#xff1a;【Y小夜】 &#x1f60e;作者簡介&#xff1a;一位雙非學校的大三學生&#xff0c;編程愛好者&#xff0c; 專注于基礎和實戰分享&#xff0c;歡迎私信咨詢&#xff01; &#x1f386;入門專欄&#xff1a;&#x1f387;【MySQL&#xff0…

RAG學習(二)

構建索引 一、向量嵌入 向量嵌入&#xff08;Embedding&#xff09;是一種將真實世界中復雜、高維的數據對象&#xff08;如文本、圖像、音頻、視頻等&#xff09;轉換為數學上易于處理的、低維、稠密的連續數值向量的技術。 想象一下&#xff0c;我們將每一個詞、每一段話、…

亞馬遜店鋪績效巡檢_影刀RPA源碼解讀

一、項目簡介 本項目是一個基于RPA開發的店鋪績效巡店機器人。該機器人能夠自動化地登錄賣家后臺&#xff0c;遍歷多個店鋪和站點&#xff0c;收集并分析各類績效數據&#xff0c;包括政策合規性、客戶服務績效、配送績效等關鍵指標&#xff0c;并將數據整理到Excel報告中&…

跨越南北的養老對話:為培養“銀發中國”人才注入新動能

2025年8月16日&#xff0c;北京養老行業協會常務副會長陳楫寶一行到訪廣州市白云區粵榮職業培訓學校&#xff0c;受到頤年集團副總李娜的熱情接待。此次訪問不僅是京穗兩地養老行業的一次深度交流&#xff0c;更為推動全國智慧養老體系建設、提升養老服務專業化水平注入了新動能…

Spring IOC 學習筆記

1. 概述Spring IOC&#xff08;Inversion of Control&#xff0c;控制反轉&#xff09;是一種設計思想&#xff0c;通過依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;實現。它的核心思想是將對象的創建和依賴關系的管理交給Spring容器&#xff0c;從而降…

揭開Android Vulkan渲染封印:幀率暴增的底層指令

ps&#xff1a;本文內容較干&#xff0c;建議收藏后反復邊跟進源碼邊思考設計思想。壹渲染管線的基礎架構為什么叫渲染管線&#xff1f;這里是因為整個渲染的過程涉及多道工序&#xff0c;像管道里的流水線一樣&#xff0c;一道一道的處理數據的過程&#xff0c;所以使用渲染管…

HTTP 請求轉發與重定向詳解及其應用(含 Java 示例)

在 Web 開發中&#xff0c;我們經常需要在不同頁面之間跳轉&#xff0c;比如登錄成功后跳到首頁、提交表單后跳到結果頁面。這時&#xff0c;常見的兩種跳轉方式就是 請求轉發&#xff08;Request Forward&#xff09; 和 重定向&#xff08;Redirect&#xff09;。雖然它們都能…

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)

如何將 MCP Server &#xff08;FastMCP&#xff09; 配置為公網訪問&#xff08;監聽 0.0.0.0&#xff09;引言常見錯誤嘗試根本原因&#xff1a;從源碼解析正確的解決方案總結引言 在使用 Model Context Protocol(MCP) 框架開發自定義工具服務器時&#xff0c;我們經常使用 …

The Network Link Layer: 無線傳感器中Delay Tolerant Networks – DTNs 延遲容忍網絡

Delay Tolerant Networks – DTNs 延遲容忍網絡架構歸屬Delay Tolerant Networks – DTNs 延遲容忍網絡應用實例例子 1&#xff1a;瑞典北部的薩米人 (Saami reindeer herders)例子 2&#xff1a;太平洋中的動物傳感網絡DTNs路由方式——存儲&轉發DTNs移動模型Random walk …

計算機視覺(opencv)實戰二——圖像邊界擴展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 圖像邊界擴展詳解與實戰在圖像處理和計算機視覺中&#xff0c;有時需要在原始圖像的四周增加邊界&#xff08;Padding&#xff09;。這種操作在很多場景中都有應用&#xff0c;比如&#xff1a;卷積神經網絡&#xff08;CNN&#xff09;中的圖像預處理…

ansible管理變量和事實

ansible管理變量和事實與實施任務控制 在 Ansible 中&#xff0c;變量和事實&#xff08;Facts&#xff09;就像給劇本&#xff08;Playbook&#xff09;配備的 “信息工具箱”&#xff0c;讓你的自動化配置管理更靈活、更智能。 變量&#xff1a;提前準備的 “預設信息” 變…

STM32--寄存器與標準庫函數--基本定時器

目錄 前言 基本定時器概念 定時時間 定時器時鐘確定 倍頻鎖相環被正確配置為168MHz 定時器的庫函數操作 代碼 定時器的寄存器操作 代碼 寄存器 后言 前言 使用平臺:STM32F407ZET6 使用數據手冊&#xff1a;STM32F407數據手冊.pdf 使用參考手冊&…

PCA 實現多向量壓縮:首個主成分的深層意義

PCA 實現多向量壓縮 第一個主成分(components_[0])正是數據協方差矩陣中最大特征值對應的特征向量。 ,layer_attention_vector[layer] 被賦值為 pca.components_[0],這確實是一個特征向量,具體來說是 PCA 分解得到的第一個主成分(主特征向量)。 關于它的維度: 假設 c…

網絡常識-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09;是互聯網的“地址簿”&#xff0c;負責將人類易記的域名&#xff08;如www.example.com&#xff09;轉換為計算機可識別的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以簡單理解為“從域名到…

Java中 23 種設計模式介紹,附帶示例

文章目錄設計模式六大原則設計模式分類1、創建型模式&#xff08;Creational Patterns&#xff09;2、結構型模式&#xff08;Structural Patterns&#xff09;3、行為型模式&#xff08;Behavioral Patterns&#xff09;一、創建型模式&#xff08;Creational Patterns&#x…

嵌入式開發入門——電子元器件~電磁繼電器、蜂鳴器

文章目錄電磁繼電器定義關鍵參數實物蜂鳴器實物內部結構分類關鍵參數電磁繼電器 定義 概述&#xff1a;電磁繼電器是利用電磁感應原理職稱的一種電磁開關&#xff0c;他能通過&#xff1a;低電壓、低電流的電路&#xff0c;來控制高電壓、高電流的電路。 關鍵參數 線圈電壓…

ROS2基礎

1.helloworld案例1.創建功能包&#xff08;C&#xff09;終端下&#xff0c;進入ws00_helloworld/src目錄&#xff0c;使用如下指令創建一個C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld執行完畢&a…