Bash編程之循環(huán)執(zhí)行

一、簡介

Bash編程的循環(huán)執(zhí)行是指某段腳本在某個條件下反復(fù)執(zhí)行,直到符合某個退出條件為止。Bash編程的循環(huán)執(zhí)行有三種方式:for、while 和until,三者有著不同的循環(huán)判斷條件,并且有著不同的適用場景。比如for循環(huán)更方便處理列表數(shù)據(jù);而while循環(huán)則可以設(shè)置一個循環(huán)結(jié)束的條件,當(dāng)該條件為真的時候,循環(huán)都會一直被反復(fù)執(zhí)行;Until循環(huán)則跟while條件剛好相反,當(dāng)循環(huán)條件為假的時候,循環(huán)會被一直執(zhí)行。

二 、命令語法結(jié)構(gòu)

1、for循環(huán)的語法:

語法一:

for 變量 in `seq 值1 值2` ; do
    循環(huán)命令
done

語法二:

for 變量 in `COMMAND`;do
    循環(huán)命令
done

語法三:

for ((初始值;循環(huán)控制;變量變化));do
    循環(huán)命令
done

2、while循環(huán)的語法

語法一:

while [ EXPRESSION ];do
    循環(huán)體
    條件修正表達(dá)式
done

語法二:

while true;do
    循環(huán)體
    條件修正表達(dá)式
done

語法三:

cat FILENAME | while read line;do
    循環(huán)體
done

語法四:

while read line;do
    循環(huán)體
done < FILENAME

3、until循環(huán)的語法

語法:

until CONDITION;do
    循環(huán)體
done

4、循環(huán)體的嵌套

for、while、until循環(huán)體支持循環(huán)體之間的嵌套,即一個for循環(huán)中可包含for、while或until循環(huán),而其他的循環(huán)體也一樣。不同循環(huán)體之間的嵌套組合可以實現(xiàn)更復(fù)雜的需求功能。

5、循環(huán)控制語句

正常來說一個循環(huán)體若想跳出循環(huán)需要取決于判斷條件的結(jié)果,但是當(dāng)一個循環(huán)體永遠(yuǎn)都不可能符合退出條件的時候,這個循環(huán)體是會一直執(zhí)行下去的,此時我們稱之為死循環(huán)或無限循環(huán)。
這時我們就可以使用break語句或continue語句來控制循環(huán)體的執(zhí)行。

  • break

下面是break控制語句的一個簡單的例子及其輸出結(jié)果:

#!/bin/bash 
declare i=0
while [ $i -le 10 ];do
        if [ $i -eq 5 ];then
                echo "loop finished."
                break
        fi
        echo $i
        let i=$i+1
done

[root@localhost tmp]# ./break.sh 
0
1
2
3
4
loop finished.

上述例子在while循環(huán)體內(nèi)嵌套了一個if選擇語句,當(dāng)i=5時,跳出循環(huán)體,此時后續(xù)循環(huán)不再繼續(xù)執(zhí)行。

  • continue

相比于break跳出整個循環(huán)體,continue語句則是用于跳出當(dāng)前循環(huán)體,如下例子:

#!/bin/bash 

declare i=0
while [ $i -le 10 ];do
        echo $i
        let i=$i+1
        if [ $i -ge 5 ];then
                continue
                echo "loop finished."
        fi
done

其輸出結(jié)果為:

[root@localhost tmp]# ./continue.sh 
0
1
2
3
4
5
6
7
8
9
10

當(dāng)i大于等5的時候,進(jìn)行if選擇語句,但是由于continue語句的存在,直接跳出了當(dāng)前的循環(huán),進(jìn)入下一個循環(huán),所以echo "loop finished."永遠(yuǎn)都不會被執(zhí)行。

三、相關(guān)練習(xí)

1、分別求100以內(nèi)所有偶數(shù)之和,100以內(nèi)所有奇數(shù)之和。(分別用for、while、until實現(xiàn))

#!/bin/bash
#for循環(huán)計算偶數(shù)之和
declare i=0
declare sum=0

for i in {1..100};do
        if [ $[$i%2] -eq 0 ];then
                let sum=$sum+$i
        else
                continue
        fi
done
echo $sum
#!/bin/bash
#for循環(huán)計算奇數(shù)之和
declare i=0
declare sum=0

for i in {1..100};do
        if [ $[$i%2] -eq 0 ];then
                continue
        else
                let sum=$sum+$i
        fi
done
echo $sum
#!/bin/bash
#while循環(huán)計算偶數(shù)之和
declare i=0
declare sum=0
while [ $i -le 100 ];do
        if [ $(($i%2)) -eq 0 ];then
                let sum=$sum+$i
                let i=$i+1
        else
                let i=$i+1
                continue
        fi
done
echo $sum
#!/bin/bash
#while循環(huán)計算奇數(shù)之和
declare i=0
declare sum=0

while [ $i -le 100 ];do
        if [ $(($i%2)) -eq 0 ];then
                let i=$i+1
                continue
        else
                let sum=$sum+$i
                let i=$i+1
        fi
done
echo $sum
#!/bin/bash
#until循環(huán)偶數(shù)之和
declare i=0
declare sum=0

until [ $i -gt 100 ] ;do
        if [ $[$i%2] -eq 0 ];then
                let sum=$sum+$i
                let i=$i+1
        else
                let i=$i+1
                continue
        fi
done
echo $sum
#!/bin/bash
#until循環(huán)奇數(shù)之和
declare i=0
declare sum=0

until [ $i -gt 100 ] ;do
        if [ $[$i%2] -eq 0 ];then
                let i=$i+1
                continue
        else
                let sum=$sum+$i
                let i=$i+1
        fi
done
echo $sum

2、分別用for、while、until循環(huán)創(chuàng)建10個用戶,密碼同用戶名。

#!/bin/bash
declare i=0
declare w=110
declare u=120
#使用for循環(huán)添加user101-user110
for i in `seq 101 110` ;do
        useradd user$i
        echo "user$i" | passwd --stdin user$i
done

#使用while循環(huán)添加user111-user120

while [ $w -gt 110 && $w -ge 120 ];do
        useradd user$w
        echo "user$w" | passwd --stdin user$w
        let w=$w+1
done

#使用until循環(huán)添加user121-user130

until [ $u -gt 130 ];do
        useradd user$u
        echo "user$u" | passwd --stdin user$u
        let u=$u+1
done

3、打印九九乘法表。

#!/bin/bash
#for循環(huán)實現(xiàn)九乘九算法打印
declare i=0
declare w=0
for i in {1..9};do
        for w in {1..9};do
                if [ $i -ge $w ];then
                        echo -e -n "$i*$w=$[$i*$w]\t"
                fi
        done
        echo " "
done

輸出:

1*1=1    
2*1=2   2*2=4    
3*1=3   3*2=6   3*3=9    
4*1=4   4*2=8   4*3=12  4*4=16   
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25   
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36   
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49   
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64   
9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81   

4、打印逆序的九九乘法表

#!/bin/bash
declare i=0
declare w=0
for i in {1..9};do
        for w in {1..9};do
                if [ $i -ge $w ];then
                        echo -e -n "$i*$w=$[$i*$w]\t"
                fi
        done
        echo " "
done| tac

輸出:

9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81   
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64   
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49   
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36   
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25   
4*1=4   4*2=8   4*3=12  4*4=16   
3*1=3   3*2=6   3*3=9    
2*1=2   2*2=4    
1*1=1    

5、用while循環(huán)實現(xiàn)腳本,完成檢查192.168.0.0/24網(wǎng)段內(nèi)IP的連通性測試。

#!/bin/bash
declare i=1
while [ $i -le 255 ];do
        ping -i 0.5 -c 1 192.168.0.$i &>/dev/null
        result=$?
        if [ $result -eq 0 ];then
                echo "ping 192.168.0.$i success."
        else
                echo "ping 192.168.0.$i fail."
        fi
        let i=$i+1
done

6、用until循環(huán)實現(xiàn)腳本,完成檢查192.168.0.0/24網(wǎng)段內(nèi)IP的連通性測試。

#!/bin/bash

declare i=1

until [ $i -ge 255 ];do
        ping -i 0.5 -c 1 192.168.0.$i &>/dev/null
        result=$?
        if [ $result -eq 0 ];then
                echo "ping 192.168.0.$i success."
        else
                echo "ping 192.168.0.$i fail."
        fi
        let i=$i+1
done
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,207評論 0 13
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,465評論 0 5
  • 循環(huán)簡介 循環(huán)可以用于讓一個程序重復(fù)地執(zhí)行語句。 循環(huán)是用來控制語句塊重復(fù)執(zhí)行的一種結(jié)構(gòu)。 循環(huán)的概念是程序設(shè)計的...
    Vinfai閱讀 1,197評論 0 0
  • 一路記曾經(jīng),回程好拾零。 有心舒塊壘,無意攬芳榮。 綠自江湖遠(yuǎn),春由袖底寧。 生當(dāng)酬大野,欲濟(jì)向滄溟。 注釋:[欲...
    周延龍閱讀 484評論 2 1
  • 我最近在做直播,就是播一些我看到的現(xiàn)場直播,我聽到的幻聽你或許聽不到,可是我在和他們對話,我想或許有一天你們可以聽...
    泡沫之夏_8b4c閱讀 139評論 0 0