linux Shell編程之循環語句(三)

目錄

一. for 循環語句

1. for語句的結構

2. for 語句應用示例

(1) 根據姓名列表批量添加用戶

(2) 根據 IP 地址列表檢查主機狀態

二. 使用 while 循環語句

1.?while 語句的結構

2. while 語句應用示例

(1) 批量添加規律編號的用戶

(2) 猜價格游戲?

三. until 循環語句

1. until?語句的結構

2. until?語句應用示例

(1) 為指定用戶發送在線消息

在 Shell?編程的廣闊領域中,循環語句與函數無疑是兩大不可或缺的基石。它們不僅能夠顯著提升腳本的執行效率,還能極大增強腳本的可讀性和可維護性。

循環語句,作為自動化處理重復任務的利器,在 shel1 編程中扮演著至關重要的角色。for 循環、while循環以及 unti1 循環,各具特色,分別適用于不同的應用場景。

for 循環擅長處理預定義的列表,如批量創建用戶賬號;while 循環則更適用于需要按特定條件重復執行操作的場景;until?循環則與 while 循環相反,在條件為假時執行循環體。

一. for 循環語句

在實際工作中,經常會遇到某項任務需要多次執行的情況,而每次執行時僅僅是處理的對象不一樣,其他命令相同。

當面對各種列表重復任務時,使用簡單的 if 語句已經難以滿足要求,而順序編寫全部代碼更是顯得異常煩瑣、困難重重。

1. for語句的結構

使用 for 循環語句時,需要指定一個變量及可能的取值列表,針對每個不同的取值重復執行相同的命令序列,直到變量值用完退出循環。在這里,“取值列表”稱為 for 語句的執行條件,其中包括多個屬性相同的對象,需要預先指定(如通訊錄、IP 黑名單)。

for 變量名 in 取值列表
do命令序列
done

for 語句的操作對象為用戶指定名稱的變量,并通過 in 關鍵字為該變量預先設置了一個取值列表,多個取值之間以空格進行分隔。位于 do.done 之間的命令序列稱為循環體,執行語句需要引用變量以完成相應的任務。

2. for 語句應用示例

(1) 根據姓名列表批量添加用戶

根據人事部門給出的員工姓名的拼音列表,在Linux 服務器中添加相應的用戶賬號,初始密碼均設置為“123456”。其中,員工姓名列表中的賬號數量并不固定,而且除了要求賬號名稱是拼音之外,并無其他特殊規律。

可先指定員工列表文件 users.txt,然后編寫一個名為 uaddfor.sh 的 Shell?腳本,從 users.txt 文件中讀取各用戶名稱,重復執行添加用戶、設置初始密碼的相關操作。

列表文件

批量添加用戶的腳本

?

?若要刪除 uaddfor.sh 腳本所添加的用戶,只需參考上述腳本代碼,將 for 循環體中添加用戶的命令序列改為刪除用戶的操作即可。

執行查看發現它已經刪除了

(2) 根據 IP 地址列表檢查主機狀態

根據包含公司各服務器 IP 地址的列表文件,檢査其中各主機的 ping 連通性,輸出各主機是否啟動、關閉。其中,服務器的數量并不固定,各服務器的IP地址之間也無特殊規律。

可先指定 IP 地址列表文件 ipadds.txt,然后編寫一個名為 chkhosts.sh 的Shell?腳本,從 ipadds.txt 文件中讀取各服務器的 IP 地址,重復執行 ping 連通性測試,并根據測試結果輸出相應的提示信息。

?其中ping -c 3 -i 0.2 -w 3 分別指的是-c:發送包的數量? -i:發送包的間隔? -w:超時時間

do…done 循環體內嵌套使用了 if 條件選擇語句,用來針對不同 IP 地址的測試吉果進行判斷,并輸出相應的提示信息。嵌套可以理解為鑲嵌、套用,就是在已有的語句、函數中在多加個或多個語句、函數等。實際上,if 語句、for 語句及其他各種 Shell?腳本語句都是可以嵌套使用的

二. 使用 while 循環語句

for 循環語句非常適用于列表對象無規律,且列表來源已固定(如某個列表文件)的場合。而對于要求控制循環次數、操作對象按數字順序編號、按特定條件執行重復操作等情況,則更適合使用另外一種循環-while 語句。

1.?while 語句的結構

使用 while 循環語句時,可以根據特定的條件反復執行一個命令序列,直到該條件不再滿足時為止。在腳本應用中,應該避免出現死循環的情況,否則后邊的命令操作將無法執行。因此,循環體內的命令序列中應包括修改測試條件的語句,以便在適當的時候使測試條件不再成立,從而結束循環。

while 循環語句的語法結構

while 條件測試操作
do命令序列
done

while 語句的執行流程:首先判斷 while 后的條件測試操作結果,如果條件成立,則執行 do..done循環體中的命令序列:返回 while 后再次判斷條件測試結果,如果條件仍然成立,則繼續執行循環體:再次返回到 while 后,判斷條件測試結果…如此循環,直到 while 后的條件測試結果不再成立為止,最后跳轉到 done 語句,表示結束循環

使用 while 循環語句時,有兩個特殊的條件測試操作,即 true(真)和 false(假)。使用 true作為條件時,表示條件永遠成立,循環體內的命令序列將無限執行下去,除非強制終止腳本(或通過 exit語句退出腳本);反之,若使用 false 作為條件,則循環體將不會被執行。這兩個特殊條件也可以用在 if語句的條件測試中。

2. while 語句應用示例

(1) 批量添加規律編號的用戶

在一些技術培訓和學習領域,出于實驗或測試的目的,需要批量添加用戶賬號,這些用戶的名稱中包含固定的前綴字串,并按照數字順序依次進行編號,賬號的數量往往也是固定的。

若要添加 20 個用戶,名稱依次為 stu1、stu2、…、stu20,可以參考以下操作。

使用變量 i 來控制用戶名稱的編號,初始賦值為 1,并且當取值大于 28 時終止循環。在循環體內部,通過語句“let i++”(等同于 i='expr $i +1`)來使變量 i 的值增加 1,因此當執行第一次循環后 i 的值將變為 2,執行第二次循環后 i 的值將變為 3,…依此類推。

若要刪除 uaddwhile.sh 腳本所添加的用戶,只需參考上述腳本代碼,將 while 循環體中添加用戶的命令序列改為刪除用戶的操作即可。

(2) 猜價格游戲?

由腳本預先生成一個隨機的價格數目(0~999)作為實際價格,判斷用戶猜測的價格是否高出或低于實際價格,給出相應提示后再次要求用戶猜測;一直到用戶猜中實際價格為止,輸出用戶共猜測的次數、實際價格。

主要設計思路如下:通過環境變量 RANDOM 可獲得一個小于 216 的隨機整數,計算其與 1000 的余數即可獲得 0~999 的隨機價格;反復猜測操作可以通過以 true 作為測試條件的while 循環實現,當用戶猜中實際價格時終止循環;判斷猜測價格與實際價格的過程采用 if 語句實現,嵌套在 while 循環體內;使用變量來記錄猜測次數。

三. until 循環語句

1. until?語句的結構

until?循環與 while 循環類似,while 循環能實現的腳本 unti1 同樣也可以實現,但區別是while循環在條件為真是繼續執行循環,而 until?則是在條件為假時執行循環.

until?循環語句的語法結構

until 條件測試操作
do命令序列
done

until?語句的執行流程:首先判斷 until?后的條件測試操作結果,如果條件不成立,則執行 do..done循環體中的命令序列;返回 until?后再次判斷條件測試結果,如果條件仍然不成立,則繼續執行循環體;再次返回到 until?后,判斷條件測試結果!…如此循環,直到 until?后的條件測試結果成立為止,最后跳轉到 done 語句,表示結束循環。

2. until?語句應用示例

在一些科學計算領域,經常會用到各種數的計算,自然數的求和操作是最簡單的。本例中計算從 1 到58 的和,從1 開始相加,采用循環的方式,每次循環后加 1,將得到的值加入計算的和中,數字運算采用的是 let 方式,直到加到 50 為止

在 i 的值小于 50 之前,每次循壞 i 的值加 1,開且求出 s 的值?

(1) 為指定用戶發送在線消息

公司內部有一臺 Linux 測試服務器,開發、測試、運維都在使用自己的賬號連接登錄到服務器上。當業務增加不能滿足使用需求時,運維決定給服務器增加內存配置,要通知開發和測試人員保存數據退出,之后再關機升級內存,以應對業務的增加。

針對上面的需求,可編寫一個名字為 until-user_online_to_write.sh 的 Shell 腳本,用于給已登錄用戶發送消息,對用戶進行檢測,必須是系統內用戶并且處于登錄狀態,通過 Linux 的 write 命令來發送消息,具體的腳本如下所示。

?

??

測試時用戶在已登錄狀態才能看到信息 用戶那面會顯示EOF

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

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

相關文章

最新扣子實戰教程,利用扣子平臺通過在線表格記錄,批量生圖,再也不要一條條的粘貼提示詞了

1、功能描述 大家好,我是濤濤。今天我要給大家講解如何在扣子平臺上對接飛書電子表格。由于多維表格相對復雜,而很多業務場景其實只需要電子表格就能滿足,因此今天我們將演示如何在扣子平臺上讀取飛書電子表格并批量生成圖片。 先看效果&am…

java -jar指定類加載

在 Java 中,使用 java -jar 命令運行 JAR 文件時,默認會加載 JAR 文件的 MANIFEST.MF 文件中指定的 Main-Class。如果你想在運行時指定一個類來加載,可以通過以下方式實現: 方法 1:直接指定類路徑和類名 如果你不想使用…

多模態思維鏈(Multimodal Chain of Thought, MCoT)六大技術支柱在醫療領域的應用

多模態思維鏈(Multimodal Chain of Thought, MCoT)通過整合文本、圖像、視頻等多模態數據,結合邏輯推理與深度學習技術,在醫療領域展現出強大的應用潛力。其六大技術支柱在醫療場景中的具體應用如下: 一、推理構建視角:醫學診斷的流程優化 MCoT通過多模態推理鏈生成技術…

從文本到視頻:基于擴散模型的AI生成系統全解析(附PyTorch實現)

當語言遇見動態視覺 "用文字生成電影場景"曾是科幻作品中的幻想,如今借助擴散模型(Diffusion Models)正逐步成為現實。本文將手把手帶你實現一個創新的文本到視頻生成系統,通過深度解析擴散模型原理,結合獨…

科普:如何通過ROC曲線,確定二分類的“理論閾值”

在二分類問題中,已知預測概率(如邏輯回歸、神經網絡輸出的概率值)時,閾值的選擇直接影響分類結果(正/負樣本判定)。 一、實踐中的閾值選擇方法 1. 基于業務目標的調整 最大化準確率:適用于樣…

2025ArkTS基礎UI(一)——Column、Row、Text、Button組件

2025ArkTS基礎UI(一)——Column、Row、Text、Button組件 前言 臭寶們,今天我們來學習ArkTS基礎UI組件的使用,其中包括: Column、Row、Text、Button組件。 知識點 Colum、Row組件用于布局,Text、Image、Button組件用于展示。 …

強化學習:基于價值的方法做的是回歸,基于策略的方法做的是分類,可以這么理解嗎?

在強化學習領域,基于價值的方法(Value-based Methods)和基于策略的方法(Policy-based Methods)是兩種核心范式。本文將從目標函數、優化機制以及與機器學習任務的類比角度,探討這兩種方法是否可以被分別理解為回歸和分類任務,并深入分析其內在邏輯。 一、基于價值的方法…

折疊屏手機:技術進步了,柔性OLED面板測試技術需求跟上了嗎?

全球智能手機市場陷入創新焦慮,折疊屏手機被寄予厚望,2023 年出貨量同比增長 62%。但在供應鏈技術狂歡背后,存在諸多問題。消費端數據顯示,用戶使用頻率低,定價策略反常。產業鏈重構雖讓部分企業獲利,卻推高…

前端在線工具 CodePen 和 JSFiddle

前端在線工具 CodePen 和 JSFiddle CodePen 概述:CodePen 是一個社交化的前端開發環境,用戶可以在這里創建代碼片段(稱為“Pens”),分享和展示自己的前端開發作品。 主要功能: 實時預覽:用戶在…

Redis-場景緩存+秒殺+管道+消息隊列

緩存一致性 1.兩次更新 先更新數據庫,再更新緩存;先更新緩存,再更新數據庫; 出現不一致問題場景: 先更新數據庫,再更新緩存; 先更新緩存,再更新數據庫; 兩次更新的適…

[Windows] 字體渲染 mactype v2025.4.11

[Windows] 字體渲染 mactype 鏈接:https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可變字體支持已到來。 本版本將可變字體支持擴展到所有 GDI 應用程序。 所有 win32 程序中的字體,如 Noto Sans、Se…

【C++】深拷貝與淺拷貝

重開也不是不可能 ~.~ 淺拷貝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 構造函數&#xff0c;初始化指針成員ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…

SpringBoot企業級開發之【用戶模塊-更新用戶頭像】

功能如下所示&#xff1a; 我們先看一下接口文檔&#xff1a; 為什么頭像是一串字符串呢&#xff1f;因為我們是將頭像圖片放到第三方去存儲&#xff0c;比如&#xff1a;阿里云等 開發思路&#xff1a; 實操&#xff1a; 1.controller 注意!這里使用【PatchMapping】注解…

vue3+vite+js項目引入electron構建跨平臺桌面應用

1.準備工作 ① 必要安裝node.js、vue、vite、electron、pnpm 本人用的node版本v18.17.1、vue版本^3.4.19、vite版本^3.2.7、electron版本^35.1.4 ② 開發調試打包安裝 "devDependencies": {"concurrently": "^9.1.2","electron-builder&…

(51單片機)串口通訊(串口通訊教程)(串口接收發送教程)

前言&#xff1a; 今天有兩個項目&#xff0c;分別為&#xff1a; 串口接收: 串口發送&#xff1a; 如上圖將文件放在Keli5 中即可&#xff0c;然后燒錄在單片機中就行了 燒錄軟件用的是STC-ISP&#xff0c;不知道怎么安裝的可以去看江科大的視頻&#xff1a; 【51單片機入門…

《汽車制造技術基礎》第一次作業

作業內容 查閱相關資料&#xff0c;談談對汽車制造技術的發展的理解。 可以是關于汽車的先進制造技術 或 汽車先進制造技術 與 制造理念的發展趨勢 或 汽車先進制造技術對環境與可持續發展的影響等。 以下從技術突破、制造理念轉型及環境影響三個維度展開對汽車制造技…

Scala day4(tuple, set and map)

Foreword Hi!! my dear friends, are you lazy at today?? Oh! I am also lazy sometimes, but you will know keep study that’s a right way at last. Now!! let’s start new travel about Scala. Text The all Codes in file day3.scala, like the below program: i…

docker compose搭建博客wordpress

一、前言 docker安裝等入門知識見我之前的這篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…

第二期:[特殊字符] 深入理解MyBatis[特殊字符]MyBatis基礎CRUD操作詳解[特殊字符]

前言 &#x1f31f; 在掌握了 MyBatis 的基本配置與環境搭建之后&#xff0c;接下來的重點便是深入理解其核心功能——CRUD 操作&#xff08;增刪改查&#xff09;。&#x1f4bb; 數據庫操作是任何應用開發中不可或缺的一環&#xff0c;而 MyBatis 正是通過靈活的 SQL 映射機…

Java面試黃金寶典46

1. Python 如何寫爬蟲 定義:Python 爬蟲是借助 Python 語言編寫程序,模擬瀏覽器行為向目標網站發送 HTTP 請求,獲取網頁內容,再通過解析工具提取所需數據的程序。其本質是自動化的數據采集過程。要點: 發送請求:利用requests庫發送 HTTP 請求,如 GET、POST 等,獲取網頁…