一、簡介
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