Shell編程-08-Shell中的迴圈語句

来源:https://www.cnblogs.com/surpassme/archive/2018/11/21/9992722.html
-Advertisement-
Play Games

    迴圈語句常用於重覆執行一條命令或一組命令等,直到達到結束條件後,則終止執行。在Shell中常見的迴圈命令有 while 、 until 、 for 和 select 等。 while語句 基礎語法 while迴圈讀取文件 1、使用exec until語句的語法與while ...


目錄

    迴圈語句常用於重覆執行一條命令或一組命令等,直到達到結束條件後,則終止執行。在Shell中常見的迴圈命令有whileuntilforselect等。

while語句

基礎語法

while <條件表達式>
do
  語句
done

while迴圈讀取文件

  • 1、使用exec
exec < FILE
while read line
do
  command
done
  • 2、使用cat和管道
cat FILEPATH/FILE | while read line
do
  command
done
  • 3、在done後使用重定向
while read line
do
  command
done < FILE

while示例

1、列印數字

[root@localhost Test]# cat while.sh
#!/bin/bash
a=$1
while [ ${a} -ge 0 ]
do
  echo "Current number is:" ${a}
  a=$((a-1))
done

[root@localhost Test]# bash while.sh 5
Current number is: 5
Current number is: 4
Current number is: 3
Current number is: 2
Current number is: 1
Current number is: 0

2、讀取文件

# 讀取網卡配置文件
[root@localhost Test]# cat readnet.sh
#!/bin/bash
while read line
 do
  echo ${line}
 done < /etc/sysconfig/network-scripts/ifcfg-ens5f1

[root@localhost Test]# bash readnet.sh
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens5f1
UUID=dbab37df-749f-4cf5-b0a9-c9d7e6632f44
DEVICE=ens5f1
ONBOOT=yes
IPADDR=192.168.8.8
NETMASK=255.255.255.0
GATEWAY=192.168.8.1

until語句

基礎語法

until  <條件表達式>
do
  語句
done

until語句的語法與while相似,區別在until會在條件表達式不成立時,進入迴圈執行命令,條件表達式成立時,終止迴圈。until的應用場景比較省,瞭解即可。

until示例

[root@localhost Test]# cat until.sh
#!/bin/bash
a=$1
until [ ${a} -ge 10 ]
do
  echo "Current number is:" ${a}
  a=$((a-1))
  if [ $a -lt 0 ]
   then
    break
  fi
done
[root@localhost Test]# bash until.sh 5 # 不滿足條件時,進入迴圈體
Current number is: 5
Current number is: 4
Current number is: 3
Current number is: 2
Current number is: 1
Current number is: 0
[root@localhost Test]# bash until.sh 50 # 滿足條件時,則不進入迴圈體
[root@localhost Test]#

for語句

    for迴圈語句與while迴圈詩句類似,但for迴圈語句主要用於有限次的迴圈場景,while主要無限次迴圈的場景,如守護進程

基礎語法

1、第一種格式

for var in list
do
  語句
done

在該結構中in list可以省略。在省略時,相當於in "$@" 即等價於for var in "$@"

2、第二種格式

for((ex1;exp2;exp3))
do
  語句
done

這種格式是類C的風格,大家也見得較多

for示例

1、列印數據

[root@localhost Test]# cat for.sh
#!/bin/bash
echo "first format for sentense "
for i in {1..5}
do
  echo ${i}
done

echo "second format for sentense"
for((j=1;j<=5;j++))
do
 echo ${j}
done
[root@localhost Test]# bash for.sh
first format for sentense
1
2
3
4
5
second format for sentense
1
2
3
4
5

2、列印文件名

[root@localhost Test]# cat printfilename.sh 
#!/bin/bash
path=$1
for filename in $(ls $1)
do
 echo ${filename}
done
[root@localhost Test]# bash printfilename.sh "/root/Test/"
caseif.sh
case.sh
compareNum.sh
eval.sh
exec.sh
for.sh
if.sh
para.sh
ping.sh
printfilename.sh
readnet.sh
shift.sh
testPID.sh
testposition.sh
until.sh
while.sh

select語句

    select 語句常用於創建選擇性菜單。在執行帶有select迴圈語句的腳本時,輸出會按照數字順序列表顯示列表選項,並顯示提示符(預設為#?),等待用戶做出選擇。

基礎語法

select var in list
do
  語句
done

1、在該結構中in list可以省略,省略相當於in "$@"即等價於select var in "$@"
2、select與for迴圈不同的是:select迴圈執行後會出現菜單選項等待用戶選擇,不會自動迴圈所有變數列表,而用戶輸入的只能是菜單項前面的數字序號,每輸入一次對應的序號則會執行迴圈一次,直至變數後面對應的列表選取完畢

select示例

1、選擇目錄文件

[root@localhost Test]# cat select.sh 
#!/bin/bash
select file in $(ls $1)
do
 echo "Current file is:"${file}
done

[root@localhost Test]# bash select.sh /root/Test
1) caseif.sh           7) if.sh         13) shift.sh
2) case.sh         8) para.sh       14) testPID.sh
3) compareNum.sh       9) ping.sh       15) testposition.sh
4) eval.sh        10) printfilename.sh  16) until.sh
5) exec.sh        11) readnet.sh        17) while.sh
6) for.sh         12) select.sh
#? 2
Current file is:case.sh
#? 3
Current file is:compareNum.sh
#? 19
Current file is:
#?

迴圈中斷控制

    大家有過編程基礎的童鞋都知道,在迴圈體出現某一種,我們可以提前中斷迴圈體。在Shell中常用的迴圈中斷控制有breakcontinueexitreturn

break/continue:常用於if、for、while等條件和迴圈語句中,從而控制流程的走向
exit:常用於終止所有語句並退出當前腳本,也可以用於返回前一次程式或命令的執行狀態
return:類似於exit,但return僅適用於函數內部返回函數的執行狀態值

以上詳細解釋如下所示:

命令 解釋
break n n:跳出迴圈的層數;如省略n,則跳出整個迴圈
continu n n: 退到第n層繼續迴圈;如省略n,則跳過本次迴圈,繼續下一次迴圈
exit n 退出當前Shell進程;n:上一次程式執行的狀態返回值, 如省略n,可使用$?獲取執行狀態值
return n 用於函數的返回值,可以用來判斷函數執行是否正確

迴圈中斷控制示例

1、break示例

[root@localhost Test]# cat break.sh
#!/bin/bash

for(( i=1;i<$1;i++ ))
do
  if [ ${i} -eq 3 ]
    then
     echo "break test"
     break
  fi
 echo ${i}
done
[root@localhost Test]# bash break.sh 5
1
2
break test

2、continue示例

[root@localhost Test]# cat continue.sh
#!/bin/bash

for(( i=1;i<$1;i++ ))
do
  if [ ${i} -eq 3 ]
    then
     echo "contiunue test"
     continue
  fi
 echo ${i}
done
[root@localhost Test]# bash continue.sh 5
1
2
contiunue test
4

3、exit示例

[root@localhost Test]# cat exit.sh

#!/bin/bash
for(( i=1;i<$1;i++ ))
do
  if [ ${i} -eq 3 ]
    then
     echo "exit test"
     exit 88
  fi
 echo ${i}
done
[root@localhost Test]# bash exit.sh 5
1
2
exit test
[root@localhost Test]# echo $?
88

迴圈語句總結

  • 1、while迴圈語句常用於執行守護進程以及實現我們希望迴圈持續執行不退出的應用,其他的迴圈則可以使用for和定時任務crond代替
  • 2、根據使用頻次,if和for使用最高,其次是while

本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是ML.NET? ML.NET是由微軟創建,為.NET開發者準備的開源機器學習框架。它是跨平臺的,可以在macOS,Linux及Windows上運行。 機器學習管道 ML.NET通過管道(pipeline)方式組合機器學習過程。整個管道分為以下四個部分: Load Data 載入數據 Trans ...
  • 在C#中做類型轉換時有時會使用到TryParse方法,該方法如果轉換失敗,out參數的值是什麼呢?我就在這裡犯傻了,特意寫文記錄下。 ...
  • 由於開發者不熟悉不同操作系統管理時區的方式,當用.Net Core開發與時區相關的應用運行在不同操作系統上會出現錯誤。這片文章將會探索一下在不同操作系統上用.Net Core 使用時區信息出現的問題與解決方案 ...
  • 索引: 商業開發實戰總結 一.API 列表 1.Where .Where(Func<M, bool> func) 如: .Where( it => (it.Prop1>=條件1 && it.Prop2<=條件2) || it.Prop3==條件3 ) 此類寫法,用在 Deleter/Updater/ ...
  • 公眾號的應用,開發及調試環境搭建 花生殼要註冊 需要二十多塊錢 ,還要實名認證,估計要一兩天才能審核通過 主要就是在 windows搭建測試環境 1.微信的應用場景 360百科微信簡介 https://baike.so.com/doc/5567128-5782263.html 微信公眾號平臺 htt ...
  • 作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 寫在前面 千呼萬喚始出來,首先,請允許我長吸一口氣!真沒想到 "一份來自28歲老程式員的自白" 這篇文章會這麼火,更沒想到的是張善友隊長的公眾號居然也轉載了這篇文章,這就導致兩天的時 ...
  • 一、前言 最近一段時間自己主要的學習計劃還是按照畢業後設定的計劃,自己一步步的搭建一個前後端分離的 ASP.NET Core 項目,目前也還在繼續學習 Vue 中,雖然中間斷了很長時間,好歹還是堅持下來了,嗯,看了看時間,原本決定的半年完成肯定是完不成了。這兩周重新拾起來學習 Vue,文章也在慢慢的 ...
  • 1 記憶體節點node 1.1 為什麼要用node來描述記憶體 這點前面是說的很明白了, NUMA結構下, 每個處理器CPU與一個本地記憶體直接相連, 而不同處理器之前則通過匯流排進行進一步的連接, 因此相對於任何一個CPU訪問本地記憶體的速度比訪問遠程記憶體的速度要快 Linux適用於各種不同的體繫結構, 而 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...