0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

bash腳本中的循環(huán)功能

CHANBAEK ? 來(lái)源:TIAP ? 作者:TIAP ? 2022-12-14 17:30 ? 次閱讀

循環(huán)是 bash 腳本中一個(gè)很重要的功能,用途廣泛。本篇文章我們介紹三種不同的循環(huán),然后利用循環(huán)遍歷數(shù)組。

for 循環(huán)

for 循環(huán)有兩種不同的寫法:

  • c 語(yǔ)言樣式的 for 循環(huán);
  • 列表中使用的 for 循環(huán)。

c 語(yǔ)言樣式的 for 循環(huán)

如果你熟悉 c 或者 c++編程語(yǔ)言,那么對(duì)于如下循環(huán)應(yīng)該不會(huì)陌生:

for ((initialize ; condition ; increment)); do
    [COMMANDS]
done

根據(jù)上述語(yǔ)法,我們寫一個(gè)例子,打印 Hello Friend 十次:

for ((i = 0 ; i < 10 ; i++)); do
    echo "Hello Friend"
done

上述代碼中,首先將整型變量 i 初始化為 0,然后設(shè)置循環(huán)條件(i<10),如果條件為真,則執(zhí)行循環(huán),打印 Hello Friend,并將變量 i 遞增 1,然后進(jìn)行下一次循環(huán),知道 i<10不再滿足。

$ bash hello.sh 
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend

列表中使用的 for 循環(huán)

列表循環(huán)是 for 循環(huán)的一種變體,這在處理列表或者數(shù)組的時(shí)候特別方便,其語(yǔ)法如下:

for item in [LIST]; do
    [COMMANDS]
done

比如,我們重寫一下上面的那個(gè)例子:

for i in {1..10}; do
    echo "Hello Friend"
done

另一個(gè)例子,下面腳本 var.sh 將打印在 /var 目錄下的所有文件和目錄:

#!/bin/bash


for i in /var/*; do
    echo $i 
done

執(zhí)行一下,其輸出如下:

$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp

while 循環(huán)

while 循環(huán)是 bash 中另一個(gè)應(yīng)用很廣泛的循環(huán),其語(yǔ)法如下:

while [ condition ]; do
    [COMMANDS]
done

作為演示,我創(chuàng)建一個(gè)名為 3x10.sh 的腳本,用于打印前10個(gè)3的倍數(shù):

#!/bin/bash


num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done

其執(zhí)行結(jié)果如下:

$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30

上述腳本中,首先將變量 num 初始化為 1,然后設(shè)定循環(huán)條件為 num 小于或等于 10。在循環(huán)體中,打印 num 乘以 3,然后將 num 遞增 1。

until 循環(huán)

如果你有 c/c++ 編程背景,那你可能會(huì)不自覺的找 do-while 循環(huán)。但是,在 bash 中并不存在 do-while 循環(huán)。

bush 中存在另一種循環(huán),即 until 循環(huán),其與 while 循環(huán)具有相同的語(yǔ)法:

until [ condition ]; do
    [COMMANDS]
Done

until 循環(huán)與 while 循環(huán)之間的主要區(qū)別在于循環(huán)條件。當(dāng)循環(huán)條件為真時(shí),while 循環(huán)會(huì)繼續(xù),但是,當(dāng)循環(huán)條件為假時(shí),until 循環(huán)才會(huì)繼續(xù)。

比如上面我們寫的 3x10.sh 腳本,我們使用 until 循環(huán)來(lái)實(shí)現(xiàn),如下:

#!/bin/bash


num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done

大家應(yīng)該可以注意到,上面的循環(huán)條件為 $num -gt 10,為前一個(gè)例子中 -le 的否定。

循環(huán)的具體應(yīng)用

上面我們介紹了 bash 中循環(huán)的用法,下面在實(shí)際例子中介紹一下循環(huán)的使用。

打印數(shù)組的內(nèi)容

在此之前,我們假定大家了解 bash 中的數(shù)組。

遍歷數(shù)組,for 循環(huán)通常是最首要的選擇。

如下腳本 prime.sh 中,將會(huì)遍歷并打印出數(shù)組中的所有元素:

#!/bin/bash


prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done

執(zhí)行一下,結(jié)果如下:

$ ./prime.sh
2
3
5
7
11
13
17
19
23
29

在循環(huán)中使用 break 和 continue

有時(shí)候我們可能希望提前退出循環(huán),或者跳過(guò)本次循環(huán)。那么此時(shí)需要分別使用 break 和 continue。

break 將會(huì)終止循環(huán),并將程序控制轉(zhuǎn)到循環(huán)后的下一個(gè)命令或指令。

比如,下面的循環(huán)只會(huì)打印從 1 到 3:

for ((i=1;i<=10;i++)); do
    echo $i
    if [ $i -eq 3 ]; then
        break
    fi
done

使用 continue 語(yǔ)句會(huì)跳過(guò)本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)。比如,下面腳本 odd.sh 只會(huì)打印從 1 到 10 之間的奇數(shù),而跳過(guò)偶數(shù):

#!/bin/bash
for ((i=0;i<=10;i++)); do
    if [ $(($i % 2)) -ne 1 ]; then
        continue
    fi
    echo $i
done

執(zhí)行結(jié)果如下:

$ ./odd.sh
1
3
5
7
9

無(wú)限循環(huán)

無(wú)限循環(huán)是一個(gè)永遠(yuǎn)運(yùn)行的循環(huán),其循環(huán)條件始終為真。大多數(shù)情況下,無(wú)限循環(huán)是因?yàn)檫壿嬪e(cuò)誤造成的bug。

例如,有人可能希望創(chuàng)建一個(gè)循環(huán),以降序打印數(shù)字1到10,結(jié)果可能會(huì)錯(cuò)誤地創(chuàng)建以下無(wú)限循環(huán):

for ((i=10;i>0;i++)); do
    echo $i
done

上述錯(cuò)誤是將 i 遞增 1。要修復(fù)這個(gè)問題需要將遞增改為遞減 i--:

for ((i=10;i>0;i--)); do
echo $i
done

在某些情況下,我們可能希望有意創(chuàng)建無(wú)限循環(huán),以等待系統(tǒng)滿足外部條件。如下所示:

for ((;;)); do
[COMMANDS]
done

如果想要?jiǎng)?chuàng)建一個(gè)無(wú)限 while 循環(huán),可參考如下:

while [ true ]; do
    [COMMANDS]
done
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135857
  • 循環(huán)
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    15947
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    387

    瀏覽量

    14811
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    10161
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    開發(fā)人員必須具備的Bash腳本知識(shí)

    您可以使用 Bash 腳本自動(dòng)執(zhí)行各種任務(wù)。掌握基礎(chǔ)知識(shí)并開始您的 Bash 腳本之旅。
    發(fā)表于 09-27 09:09 ?413次閱讀

    bash腳本檢查子字符串的方法

    我們?cè)趯?bash 腳本的時(shí)候,假如有一個(gè)字符串,我們想檢查其中是否包含另一個(gè)子字符串,那這個(gè)時(shí)候需要怎樣做呢?
    發(fā)表于 11-24 15:25 ?1593次閱讀
    <b class='flag-5'>bash</b><b class='flag-5'>腳本</b><b class='flag-5'>中</b>檢查子字符串的方法

    bash腳本的test命令詳解

    bash 腳本的 test? 命令用于檢查表達(dá)式的有效性,檢查命令或表達(dá)式為 true 或者 false。此外,它還可以用于檢查文件的類型和權(quán)限。
    發(fā)表于 11-24 15:32 ?3682次閱讀
    <b class='flag-5'>bash</b><b class='flag-5'>腳本</b><b class='flag-5'>中</b>的test命令詳解

    如何在bash shell腳本中使用變量

    如果你使用編程語(yǔ)言編寫過(guò)程序,那么一定接觸過(guò)變量。而在 bash 腳本的編寫時(shí),變量也是一個(gè)很重要的概念。今天我們分享一下如何在 bash 腳本中使用變量。
    發(fā)表于 12-02 16:32 ?2012次閱讀
    如何在<b class='flag-5'>bash</b> shell<b class='flag-5'>腳本</b>中使用變量

    如何通過(guò)命令行將變量以參數(shù)的形式傳遞給bash腳本

    我們?cè)谏弦黄恼轮薪榻B了如何在 bash 腳本中使用變量,可以響應(yīng)各種數(shù)據(jù)以及接收用戶輸入。
    發(fā)表于 12-02 16:38 ?1328次閱讀
    如何通過(guò)命令行將變量以參數(shù)的形式傳遞給<b class='flag-5'>bash</b><b class='flag-5'>腳本</b>

    高級(jí)Bash 腳本編程指南

    高級(jí)Bash 腳本編程指南
    發(fā)表于 10-26 08:33 ?7次下載
    高級(jí)<b class='flag-5'>Bash</b> <b class='flag-5'>腳本</b>編程指南

    命令行重度用戶需要的實(shí)用BASH腳本

    今天,我偶然發(fā)現(xiàn)了一組適用于命令行重度用戶的實(shí)用 BASH 腳本,這些腳本被稱為 Bash-Snippets,它們對(duì)于那些整天都與終端打交道的人來(lái)說(shuō)可能會(huì)很有幫助。
    的頭像 發(fā)表于 08-30 10:37 ?2567次閱讀

    虛擬機(jī):Bash Shell腳本打印出執(zhí)行的命令

    默認(rèn)情況下,bash腳本不會(huì)打印執(zhí)行的每個(gè)命令,這個(gè)有時(shí)候不太方面。
    的頭像 發(fā)表于 06-22 14:44 ?4501次閱讀

    Raspberry Pi Bash Shell 腳本簡(jiǎn)介

      拋開潛在的麻煩不談,Bash 可以是一個(gè)非常強(qiáng)大的工具,讓您可以自動(dòng)執(zhí)行各種任務(wù)。在即將發(fā)表的文章,我將展示如何使用 Bash 腳本以及一些硬件技巧來(lái)自動(dòng)化我的 Raspberr
    的頭像 發(fā)表于 08-15 15:08 ?1133次閱讀
    Raspberry Pi <b class='flag-5'>Bash</b> Shell <b class='flag-5'>腳本</b>簡(jiǎn)介

    如何在bash shell腳本接受參數(shù)

    終端命令通常包含一些參數(shù),在使用的時(shí)候可以提供不同的參數(shù)來(lái)確定命令的執(zhí)行方式。POSIX規(guī)范包含了用于命令行接口的選項(xiàng)。這也是與最早的UNIX應(yīng)用程序建立的一個(gè)由來(lái)已久的約定,所以當(dāng)你在寫bash腳本的時(shí)候,需要知道如何在
    的頭像 發(fā)表于 12-09 17:34 ?2610次閱讀

    bash如何創(chuàng)建函數(shù)

    當(dāng)你的 bash 腳本中代碼非常多的時(shí)候,會(huì)看起來(lái)很混亂,其中有部分代碼有可能是重復(fù)的。這個(gè)時(shí)候,可以使用函數(shù)來(lái)避免重復(fù)的代碼。
    的頭像 發(fā)表于 12-14 17:31 ?1131次閱讀

    Bash腳本特殊變量$0是什么?

    Bash 腳本,`$0` 是一個(gè)特殊變量,它代表當(dāng)前腳本的路徑和名稱。這個(gè)變量用于表示腳本自身,它是
    的頭像 發(fā)表于 05-12 14:41 ?1808次閱讀

    BASH shell腳本篇—條件命令

    這篇文章介紹下BASH shell的條件相關(guān)的命令,包括:if, case, while, until, for, break, continue。
    的頭像 發(fā)表于 10-11 15:21 ?556次閱讀
    <b class='flag-5'>BASH</b> shell<b class='flag-5'>腳本</b>篇—條件命令

    BASH shell腳本篇—函數(shù)

    函數(shù)是代碼重用的最重要方式。Bash函數(shù)可以定義為一組命令,在bash腳本多次調(diào)用。
    的頭像 發(fā)表于 10-20 16:31 ?1009次閱讀

    BASH shell腳本篇—文件處理介紹

    Bash Shell腳本,可以使用多種方法來(lái)對(duì)文件進(jìn)行操作,包括讀取文件或?qū)懭胛募?/div>
    的頭像 發(fā)表于 10-23 16:51 ?563次閱讀