1. 程式人生 > 實用技巧 >While & For 迴圈

While & For 迴圈

While 迴圈

可以將 While 迴圈稱為 "條件迴圈"

While 迴圈語法

# 條件為 true 就執行迴圈體程式碼,條件變為 false 迴圈結束
while 條件
do
    命令1
    命令2
    命令3
    ...
done

# 示例
#!/bin/bash

count=0

while [ $count -lt 5 ]  
do
    echo $count 
    let count++  # 5
done

Until 迴圈語法

# 條件為 false 就執行迴圈體程式碼,條件變為 true 迴圈結束
until 條件
do
    命令1
    命令2
    命令3
    ...
done

# 示例
#!/bin/bash

count=0

until [ $count -eq 5 ]   
do
    echo $count 
    let count++  # 5
done

While 迴圈關鍵字

Break:立即終止本層迴圈

Continue:終止本次迴圈

#!/bin/bash

count=0

while [ $count -lt 5 ]  # 1 < 5
do
    if [ $count -eq 3 ];then
        # break
        let count++
        continue
    fi
    echo $count 
    let count++  # 3
done

總結:結束 while 迴圈的兩種方案

①. — 在迴圈體程式碼中把某個值改掉,讓 While 迴圈條件變為假

[root@zzzwqh wqh05]# cat test.sh 
#!/bin/bash

count=0
while [ $count -lt 3 ]
do
    echo 1111
    count=100
    echo 2222
    echo 3333

done

# 此時迴圈體內程式碼會執行完,之後結束指令碼
[root@zzzwqh wqh05]# ./test.sh  
1111
2222
3333
[root@zzzwqh wqh05]# 

②. — break,直接退出本層 While 迴圈

[root@zzzwqh wqh05]# cat test.sh 
#!/bin/bash

count=0
while [ $count -lt 3 ]
do
    echo 1111
    #count=100
    break
    echo 2222
    echo 3333

done

# 此時迴圈體內程式碼不會執行完,break 後的程式碼不會執行
[root@zzzwqh wqh05]# ./test.sh 
1111
[root@zzzwqh wqh05]# 

③. — 延伸,多層巢狀時,設定相同 While 迴圈條件,退出迴圈時,一起退出

# 正常情況下,break 結束巢狀多層的迴圈,要寫很多層
while 條件1
do
	while 條件2
    do
        while 條件3
        do
        	break  
        done
        break
    done
    break
done
    
    
# 把條件改為 false
tag=true
while $tag
do
	while $tag
    do
        while $tag
        do
        	tag=false
        done
    done
done

While 迴圈示例

Wget 測試網路

[root@zzzwqh wqh05]# 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@zzzwqh wqh05]# 

[root@zzzwqh wqh05]# ./check_web.sh 
只能輸入一個引數
[root@zzzwqh wqh05]# ./check_web.sh www.baidu.com
=========>0
www.baidu.com is ok
[root@zzzwqh wqh05]# ./check_web.sh www.zzzwqh.com.cn
=========>0
=========>1
=========>2
=========>3
報警:www.zzzwqh.com.cn is dead

讀取檔案按行列印

[root@zzzwqh wqh05]# cat 6.sh
#!/bin/bash

while read line
do
    echo $line
done < a.txt
[root@zzzwqh wqh05]# ./6.sh 
11111 1:1 1
22222
3333
4444
[root@zzzwqh wqh05]# 

動態監測系統狀態

[root@zzzwqh ~]# while :;do free;sleep 0.5;clear;done

For 迴圈

可以將 For 迴圈稱為 "取值迴圈"

Shell 風格語法

for i in value1 value2 value3
do
    echo $i
done

# 示例
[root@zzzwqh wqh05]# cat example.sh 
#!/bin/bash

for i in "aaa" 222 "ccc"
do
    echo $i
done

# 取範圍
[root@zzzwqh wqh05]# example.sh
#!/bin/bash

for i in {5..1}
do
   echo $i
done

for i in {a..z}
do
   echo $i
done

C 語言風格語法

# 語法格式
#!/bin/bash
for ((i=0;i<3;i++))
do
    echo "命令1"
    echo "命令2"
    echo "命令3"
done

Break & Continue 適用於 For 迴圈

# A-Z 忽略 C
[root@zzzwqh wqh05]# cat 9.sh 
#!/bin/bash

for i in {A..Z}
do
   if [ $i == "C" ];then
     # break
     continue
   fi
   echo $i
done
[root@zzzwqh wqh05]# 

For 迴圈示例

統計指定目錄下檔案的型別

[root@k8s-master 828]# cat file_type_sum.sh
#!/bin/bash
path=$1
block_type=0
regular_type=0
symbolic_type=0
directory_type=0
character_type=0

[ $# -ne 1 ] && echo "需要指定一個目錄" && exit
 
for i in `ls $path`
do
    [ -b /$path/$i ] && let block_type++
    [ -L /$path/$i ] && let symbolic_type++
    [ -d /$path/$i ] && let directory_type++
    [ -f /$path/$i ] && let regular_type++
    [ -c /$path/$i ] && let character_type++
done


echo "塊檔案:$block_type"
echo "普通檔案:$regular_type"
echo "軟連結檔案:$symbolic_type"
echo "目錄檔案:$directory_type"
echo "字元裝置檔案:$character_type"