SHELL使用--while循環


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM