目錄
while循環
while循環語法
` 前提: 條件為true就執行循環體代碼,條件變為false循環結束 `
# 語法:
while 條件
do
命令1
命令2
命令3
...
done
================================
#示例(最開始的值為0,依次循環,直到滿足條件count等於或者大於5,就停止循環,停止循環的前提就是條件變成false)
#!/bin/bash
count=0
while [ $count -lt 5 ]
do
echo $count
let count++
done
until語法
` 條件為false就執行循環體代碼,條件變為true循環結束 `
# until語法:
until 條件
do
命令1
命令2
命令3
...
done
================================
# 示例(條件不滿足就執行,一旦滿足就退出循環,這里初始值為0,每次都自增,一旦等於5就停止循環)
#!/bin/bash
count=0
until [ $count -eq 5 ]
do
echo $count
let count++ # 5
done
循環結束命令
`break` :
- 立即終止本層循環(當前的while循環直接退出,break后面的指令都不會執行,但當前級別之上還有循環,就執行上級別循環,否則直接退出腳本。)
`continue` :
終止本次循環(當前循環下面的命令都不會被執行,但本次循環結束后任然會繼續執行本層的循環。)
# 示例:
#!/bin/bash
count=0
while [ $count -lt 5 ]
do
if [ $count -eq 3 ];then
# break
let count++
continue
fi
echo $count
let count++
done
# 輸出結果:
[root@db01 day05]# ./test1.sh
0
1
2
4
# 這里注意,不能將let count++放到continue下方,因為continue退出方式,不會執行它自身下方的任何指令,那當值為3時不會自增,將一直為3。
循環結束方案
方案一:條件為假
# 這里直接在循環當中為count進行賦值操作,所以第一次結果會完全顯示,但是當第二次循環count值匹配大於3,將不會執行此循環
[root@egon day05]# cat test.sh
#!/bin/bash
count=0
while [ $count -lt 3 ]
do
echo 1111
count=100
echo 2222
echo 3333
done
[root@egon day05]# ./test.sh
1111
2222
3333
方案二:break
# 使用break的方式直接退出本層循環,break后續操作將不再被執行
[root@egon day05]# cat test.sh
#!/bin/bash
count=0
while [ $count -lt 3 ]
do
echo 1111
#count=100
break
echo 2222
echo 3333
done
[root@egon day05]# ./test.sh
1111
方案三:多層嵌套循環退出(了解)
# break結束嵌套多層的循環(可使用break 3,指定退出三層的循環,否則break只會退出本層的循環體)
while 條件1
do
while 條件2
do
while 條件3
do
break 3
done
# break
done
# break
done
# 把條件改為false,最里層的條件改變直接影響了,三層的改變。
tag=true
while $tag
do
while $tag
do
while $tag
do
tag=false
done
done
done
案例一:登錄腳本
# 如果用戶名密碼正確,直接退出本層循環,這里也就直接退出腳本,但輸入錯誤,則提示密碼錯誤,然后循環此次腳本。
[root@egon day05]# cat login_new.sh
#!/bin/bash
tag=true
while $tag
do
read -p "用戶名:" name
read -p "密碼:" pass
if [ $name == "egon" ] && [ $pass == "123" ];then
echo "login successful"
#tag=false
break
else
echo "user or password error"
fi
done
案例二:登錄腳本升級版
# 升級版,多了一個功能,針對用戶輸入正確后,再進入一個循環,循環體內模擬了命令提示符功能,並在循環體內發現執行q即退出。
#!/bin/bash
while true
do
read -p "用戶名:" name
read -p "密碼:" pass
if [ $name == "egon" ] && [ $pass == "123" ];then
echo "login successful"
while true
do
read -p "[root@egon ------->]# " cmd
if [ $cmd == "q" ];then
break
fi
$cmd
done
break
else
echo "user or password error"
# continue # 不要畫蛇添足,寫與不寫都會再次循環,並且退出此次循環
fi
done
案例三:網站測試
# 網站可以訪問即輸出一個ok,如果網站訪問超過三次任然無法訪問,就提示報警
[root@egon day05]# cat check_web.sh
#!/bin/bash
[ $# -ne 1 ] && echo "只能輸入一個參數" && exit
url=$1
count=0
while true
do
echo "=========>$count"
if [ $count -eq 3 ];then
echo "報警:$url is dead"
break
fi
wget --timeout=1 --tries=3 $url -q
if [ $? -eq 0 ];then
echo "$url is ok"
break
else
let count++
fi
done
============================================== `結果顯示` =====================
[root@egon day05]# ./check_web.sh
只能輸入一個參數
[root@egon day05]# ./check_web.sh www.baidu.com
=========>0
www.baidu.com is ok
[root@egon day05]# ./check_web.sh www.egon.com.cn
=========>0
=========>1
=========>2
=========>3
報警:www.egon.com.cn is dead
案例三:while讀取文件
# 可以將文件中的內容一行行進行讀取
[root@egon day05]# cat 6.sh
#!/bin/bash
while read line
do
echo $line
done < a.txt
[root@egon day05]# ./6.sh
11111 1:1 1
22222
3333
4444
案例四:動態監控系統
# 使用while循環free命令,每次間隔0.5秒,實現和top相似功能
[root@egon ~]# while :;do free;sleep 0.5;clear;done