目錄
一、for循環(huán)
1、基本格式
2、類C語言格式
二、while循環(huán)
1、基本格式
2、死循環(huán)語句
三、跳出循環(huán)
1、continue跳出循環(huán)
2、break跳出循環(huán)
四、常用循環(huán)腳本實(shí)例
1、循環(huán)打印9*9乘法表
2、循環(huán)ping測試某個(gè)網(wǎng)段網(wǎng)絡(luò)連通性
3、while死循環(huán)實(shí)現(xiàn)猜數(shù)字游戲
一、for循環(huán)
用于已知循環(huán)次數(shù)的場景
1、基本格式
for? ?變量名稱(注意是名稱不是變量$等)? ? [? in? ?名稱范圍? ] (可以不寫)
do? ?
執(zhí)行內(nèi)容? ??若滿足循環(huán)則做什么動(dòng)作
done? ? for循環(huán)結(jié)束標(biāo)志
舉例:
vim a.sh #創(chuàng)建腳本a.sh
腳本內(nèi)容:
#!/bin/bash
for i in {1..5} #for循環(huán)10次,第一次i=1,第二次i=2以此類推直到i=5
do
echo "$i" #循環(huán)動(dòng)作,每次輸出$i
done #for語句結(jié)束標(biāo)志
bash a.sh #調(diào)用shell執(zhí)行腳本a.sh
執(zhí)行結(jié)果:
1
2
3
4
5
2、類C語言格式
for (( 表達(dá)式1 ;表達(dá)式2;表達(dá)式3? ?))
do
執(zhí)行內(nèi)容? ??若滿足循環(huán)則做什么動(dòng)作
done? ? ? ? ? ?for循環(huán)結(jié)束標(biāo)志
表達(dá)式1:定義變量并賦值
表達(dá)式2:決定是否循環(huán)
表達(dá)式3:決定循環(huán)變量如何改變,決定循環(huán)什么時(shí)候結(jié)束
舉例:
vim a.sh
腳本內(nèi)容:
#!/bin/bash
for(( i=0;i<=5;i++ )) #定義for循環(huán)i變量初始值為0,循環(huán)條件i小于等于5,每循環(huán)一次i自加1
do
echo "$i" #for循環(huán)每循環(huán)一次執(zhí)行一次輸出$i
done #for語句結(jié)束標(biāo)志
bash a.sh #調(diào)用shell執(zhí)行腳本
輸出結(jié)果:
0
1
2
3
4
5
二、while循環(huán)
用于不知道循環(huán)次數(shù),需要主動(dòng)結(jié)束循環(huán)或達(dá)到條件結(jié)束循環(huán)。
1、基本格式
while? ?[ 判斷條件]?使用while循環(huán)滿足條件執(zhí)行do,不滿足不執(zhí)行?
do? ? ? ?
執(zhí)行動(dòng)作? ?while循環(huán)執(zhí)行動(dòng)作
done? ? ? ? ?while循環(huán)結(jié)束標(biāo)志
舉例:
vim b.sh #創(chuàng)建腳本b.sh
腳本內(nèi)容:
#!/bin/bash
i=0
while [ $i -le 5 ] #變量i小于等于5時(shí)執(zhí)行while循環(huán)
do
echo "$i" #循環(huán)執(zhí)行內(nèi)容,每循環(huán)一次打印$i
let i++ #每循環(huán)一次計(jì)算一次i++即i自己+1
done #while語句結(jié)束標(biāo)志
bash b.sh #調(diào)用bash執(zhí)行b.sh腳本
執(zhí)行結(jié)果:
0
1
2
3
4
5
2、死循環(huán)語句
①while? [1? -eq? 1]? ?判斷條件寫一個(gè)永久為真的條件?
? ? do? ? ? ?一直執(zhí)行do內(nèi)的命令
? ? done
②while? true? ? ? ? 直接寫判斷條件為真
? ? do? ? ? ?一直執(zhí)行do內(nèi)的命令
? ? done
③while :? ? ? ? ?判斷條件為冒號也表示死循環(huán)
? ? do? ? ? ?一直執(zhí)行do內(nèi)的命令
? ? done
三、跳出循環(huán)
1、continue跳出循環(huán)
①表示滿足continue條件時(shí)跳出循環(huán),但是不影響后續(xù)循環(huán)執(zhí)行
舉例:
vim a.sh #創(chuàng)建腳本a.sh
腳本內(nèi)容:
#!/bin/bash
for i in {1..5} #for循環(huán)5次從i=1開始到i=5
do
if [ $i -eq 3 ] #if判斷語句,若$1等于3則執(zhí)行then的內(nèi)容
then
continue #當(dāng)$i=3時(shí)跳出循環(huán)但不影響后面循環(huán)
fi #結(jié)束if語句
echo "$i" #沒執(zhí)行一次for循環(huán)輸出一次$i
done #for循環(huán)結(jié)束語句
bash a.sh #調(diào)用shell執(zhí)行腳本
輸出結(jié)果
1
2
4
5
2、break跳出循環(huán)
在某個(gè)循環(huán)中遇到break直接結(jié)束此次循環(huán),但是不影響外邊嵌套的循環(huán)。
break? [數(shù)字] 結(jié)束數(shù)字中的幾次循環(huán),若為2則結(jié)束自己所在循環(huán)和外邊嵌套的一層循環(huán),若為3則結(jié)束自己所在循環(huán)和外邊嵌套的2層循環(huán)
舉例:
vim a.sh #創(chuàng)建a.sh腳本
腳本內(nèi)容:
#!/bin/bash
for j in {1..3} #第一層for循環(huán),j=1,2,3各執(zhí)行一次do的內(nèi)容
do #第一層for循環(huán)的執(zhí)行內(nèi)容
for i in {1..5} #第二層for循環(huán),i=1,2,3,4,5各執(zhí)行一次do的內(nèi)容
do #第二層for循環(huán)的執(zhí)行內(nèi)容
if [ $i -eq 3 ] #第二層for循環(huán)中添加的if判斷語句,當(dāng)$i=3是執(zhí)行then內(nèi)容
then
break #第二層for循環(huán)判斷語句執(zhí)行命令,break結(jié)束循環(huán)
fi #if語句結(jié)束
echo "$i" #第二層for循環(huán)語句執(zhí)行每循環(huán)一次輸出$i
done #第二層for循環(huán)語句結(jié)束標(biāo)志
done #第一層for循環(huán)語句結(jié)束標(biāo)志
bash a.sh #調(diào)用bash執(zhí)行a.sh腳本
執(zhí)行結(jié)果:第二層執(zhí)行在$i=3是結(jié)束了循環(huán),所以只能輸出1和2,第一層for循環(huán)是循環(huán)3次,所以輸出了3次。
1
2
1
2
1
2
四、常用循環(huán)腳本實(shí)例
1、循環(huán)打印9*9乘法表
思路:
①第一步for循環(huán)打印一行9個(gè)*號
②第二步再添加一個(gè)for循環(huán)打印一個(gè)9行9列的*號正方形
②第三步將*號正方形斜砍一般形成9*9乘法表的基本格式
③第四步將*號9*9乘法表格式用乘法算式替換
9*9乘法表
第一步:
vim 99.sh #創(chuàng)建99.sh腳本
腳本內(nèi)容:
#!/bin/bash
for i in {1..9} #for循環(huán)9次從i=1開始
do
echo -n "*" #每循環(huán)一次打印一個(gè)*,echo -n參數(shù)表示不換行
done #此for循環(huán)語句結(jié)束
bash 99.sh #調(diào)用shell執(zhí)行腳本
執(zhí)行結(jié)果:
*********
第二步:
vim 99.sh #編輯99.sh腳本
腳本內(nèi)容:
#!/bin/bash
for j in {1..9} #添加打印列循環(huán),循環(huán)9次從j=1開始
do #j循環(huán)時(shí)做do中的內(nèi)容
for i in {1..9} #第一步for循環(huán)內(nèi)容不變
do
echo -n "*"
done
echo #列循環(huán)每循環(huán)一次打印一行空格進(jìn)行換行
done #列循環(huán)for語句結(jié)束標(biāo)志
bash 99.sh #調(diào)用shell執(zhí)行腳本
執(zhí)行結(jié)果:
*********
*********
*********
*********
*********
*********
*********
*********
*********
第三步:
vim 99.sh #編輯99.sh腳本
腳本內(nèi)容:
#!/bin/bash
for j in {1..9} #列循環(huán)內(nèi)容不變
do
for i in `seq $j` #修改行循環(huán)i的取值范圍為展開變量j,即當(dāng)j=1時(shí)i取值只有1,所以循環(huán)一次。當(dāng)
j=2時(shí),i取值為1和2,所以i=1和i=2各循環(huán)一次,循環(huán)2次。以此類推到j(luò)=9
do
echo -n "*"
done
echo
done
bash 99.sh #調(diào)用shell執(zhí)行腳本
執(zhí)行結(jié)果:
*
**
***
****
*****
******
*******
********
*********
第四步:
vim 99.sh #編輯99.sh腳本
腳本內(nèi)容:
#!/bin/bash
for j in {1..9} #列循環(huán)內(nèi)容不變
do
for i in `seq $j`
do
echo -ne "$j*$i=$[ $j*$i ]\t" #行輸出內(nèi)容修改為9*9算式和結(jié)果。$[ ]表示計(jì)算里面的正整數(shù)結(jié)
果,echo -e參數(shù)表示調(diào)用轉(zhuǎn)義符,\t表示制表符即循環(huán)時(shí)輸出一個(gè)tab鍵
done
echo
done
bash 99.sh #調(diào)用shell執(zhí)行腳本
輸出結(jié)果:
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
2、循環(huán)ping測試某個(gè)網(wǎng)段網(wǎng)絡(luò)連通性
需求:測試用戶輸入的某個(gè)32位網(wǎng)段是否可以ping通,且若可以ping通將此ip輸出到文件host.txt中。
思路:
①第一步讀取用戶輸入的32位網(wǎng)段。
②使用for循環(huán)生成用戶輸入網(wǎng)段的所有ip。
③使用ping命令在循環(huán)中測試用戶輸入網(wǎng)段內(nèi)所有ip,注意指定ping包個(gè)數(shù)和超時(shí)結(jié)束時(shí)間,否則一直ping。
④將循環(huán)檢查網(wǎng)絡(luò)連通性放入后臺執(zhí)行。
vim ping.sh #創(chuàng)建ping.sh腳本
腳本內(nèi)容:
#!/bin/bash
read -p "請輸入需要測試的網(wǎng)段,格式為(192.168.30.):" ip #讀取用戶輸入內(nèi)容為變量ip
for i in {1..254} #for循環(huán)254次,從i=1開始
do
{ #將{}內(nèi)容當(dāng)成一個(gè)整體
ping -c2 -w2 $ip$i &>/dev/null #指定ping包為2個(gè)超時(shí)結(jié)束時(shí)間為2秒且將產(chǎn)生的內(nèi)容全部放入null垃圾桶中,&符號表示錯(cuò)誤輸出也放入null垃圾桶中
if [ $? -eq 0 ] #if條件判斷如果上一個(gè)循環(huán)執(zhí)行的命令是正確的則$?返回0,若等于0執(zhí)行then的內(nèi)容
then
echo "$ip$i is online" #if條件成立執(zhí)行打印
echo $ip$i >> host.txt #將if條件成立的ip追加到host.txt文件中
else
echo "$ip$i is offline" #if添加判斷不成立執(zhí)行打印
fi
}& #將循環(huán)成立的內(nèi)容放入后臺執(zhí)行
done
wait #執(zhí)行結(jié)束不等待直接退出
3、while死循環(huán)實(shí)現(xiàn)猜數(shù)字游戲
需求:生成隨機(jī)1-100的價(jià)格給用戶猜測直到猜對結(jié)束游戲,并統(tǒng)計(jì)用戶猜對猜了幾次。
思路:
①第一步生成一個(gè)隨機(jī)1-100數(shù)字
②第二步使用while循環(huán)寫一個(gè)死循環(huán)直到用戶猜對才結(jié)束循環(huán)
③在執(zhí)行循環(huán)的過程中統(tǒng)計(jì)循環(huán)執(zhí)行次數(shù)并輸出
vim game.sh #創(chuàng)建腳本game.sh
腳本內(nèi)容:
#!/bin/bash
num=`echo $[ RANDOM%100+1 ]` #$[RANDOM]是一個(gè)0-32767的隨機(jī)數(shù),%100+1除100取余+1表示生成0-100隨機(jī)數(shù)
time=0 #定義猜對次數(shù)變量time初始值為0
while true #生成while死循環(huán)
do #循環(huán)動(dòng)作為do內(nèi)的內(nèi)容
let time++ #每循環(huán)一次time變量自加1
read -p "請輸入您猜測的數(shù)字,范圍(1-100):" user #讀取用戶輸入的內(nèi)容為變量user
if [ $user -eq $num ] #條件判斷分支1,如果用戶輸入等于隨機(jī)生成執(zhí)行then動(dòng)作
then
echo "您猜對了,您一共猜測了$time次" #if分支1條件成立執(zhí)行輸出
break #if分支1條件成立則結(jié)束本次循環(huán)
elif [ $user -gt $num ] #條件判斷分支2,如果用戶輸入大于隨機(jī)生成執(zhí)行本次then動(dòng)作
then
echo "您猜大了,請往小猜" #條件判斷分支2成立提示用戶猜大了
elif [ $user -lt $num ] #條件判斷分支3,如果用戶輸入小于隨機(jī)生成執(zhí)行本次then動(dòng)作
then
echo "您猜小了,請往大猜" #條件判斷分支3成立提示用戶猜小了
fi #if語句結(jié)束
done
bash game.sh #調(diào)用bash執(zhí)行腳本
執(zhí)行結(jié)果
請輸入您猜測的數(shù)字范圍(1-100):50
您猜小了,請往大猜
請輸入您猜測的數(shù)字范圍(1-100):60
您猜小了,請往大猜
請輸入您猜測的數(shù)字范圍(1-100):70
您猜大了,請往小猜
請輸入您猜測的數(shù)字范圍(1-100):65
您猜大了,請往小猜
請輸入您猜測的數(shù)字范圍(1-100):62
您猜小了,請往大猜
請輸入您猜測的數(shù)字范圍(1-100):63
恭喜您猜對了,您一共猜了6次
4、數(shù)字累加腳本(1-100)?
需求:編寫腳本實(shí)現(xiàn)計(jì)算從1加到100的值
思路:
①累加需要用到循環(huán),已知循環(huán)次數(shù)時(shí)使用for循環(huán)
②也可以使用while循環(huán)達(dá)到累加條件時(shí)結(jié)束循環(huán)
vim sum.sh #創(chuàng)建sum.sh腳本
腳本內(nèi)容:
sum=0 #定義變量sum初始值為0
for i in {1..100} #for循環(huán) i取值從1到100
do
sum=$[ i+sum ] #每次循環(huán)內(nèi)容計(jì)算變量i+sum的值賦值給sum
done #for語句結(jié)束標(biāo)志
echo "1-100累加值為:$sum" #循環(huán)結(jié)束后輸出內(nèi)容
bash sum.sh #調(diào)用shell執(zhí)行腳本
執(zhí)行結(jié)果:
"1-100累加值為:5050"
vim sum1.sh #創(chuàng)建sum1.sh腳本
腳本內(nèi)容
#!/bin/bash
sum=0 #定義sum變量初始值
i=0 #定義i變量初始值
while [ $i -le 100 ] #while循環(huán),條件為當(dāng)$1小于等于100時(shí)執(zhí)行
do
sum=$[ i+sum ] #循環(huán)執(zhí)行內(nèi)容計(jì)算i+sum的值重新賦值給i
let i++ #每執(zhí)行一次循環(huán)計(jì)算一次變量i自加1
done #while語句結(jié)束標(biāo)志
echo "1-100的累加值為:$sum" #循環(huán)完成后輸出
bash sum1.sh #調(diào)用bash執(zhí)行腳本
執(zhí)行結(jié)果:
1-100的累加值為:5050
?文章來源地址http://www.zghlxwxcb.cn/news/detail-792163.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-792163.html
?
?
?
到了這里,關(guān)于Linux系統(tǒng)Shell腳本第三章:for、while循環(huán)及腳本實(shí)操的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!