天天看點

08@流程控制之for循環

文章目錄

  • ​​流程控制之for循環​​
  • ​​一、文法​​
  • ​​1、shell風格的for,常用in清單方式​​
  • ​​2、continue與for​​
  • ​​二 案例​​
  • ​​1、案例:shell風格的for​​
  • ​​2、案例:c語言風格的for​​
  • ​​3、案例:檢查内網存活的ip,使用&符号提升腳本的運作效率​​
  • ​​4、案例:編寫檔案類型測試腳本,支援多個參數​​
  • ​​5、案例:可以直接在指令行編寫for循環​​
  • ​​6、案例:統計dev下每種檔案類型的數量​​
  • ​​7、案例:檢查使用者​​
  • ​​8、案例:使用者提添加與删除​​
  • ​​9、案例:使用者建立編寫​​
  • ​​10、案例:嵌套多層for循環,結合break與continue(了解)​​
  • ​​11、案列:編寫99乘法表(for)​​

流程控制之for循環

一、文法

#===========》Shell風格文法
for 變量名 [ in 取值清單 ]
do
    循環體
done

#===========》C語言風格文法
for ((初值;條件;步長))      

1、shell風格的for,常用in清單方式

for i in 1 2 3
for i in {1,2,3}
for i in {1..9}
for i in {9..1}
for i in {a..z}
for i in {A..Z}
for i in {X..Z}
for i in $(指令)  # 例如:for i in $(head -10 /etc/passwd);do echo $i|cut -d: -f1,2;done
for i in $(find ...)      

2、continue與for

continue: #預設退出本次(這一次)循環

break:    #預設退出本層(整個)循環      

二 案例

1、案例:shell風格的for

for i in {1..10}      

2、案例:c語言風格的for

for ((i=1;i<=10;i++))  #運用文法條件限制引用變量      

3、案例:檢查内網存活的ip,使用&符号提升腳本的運作效率

#!/bin/bash

for i in {1..254}  #連續選擇循環引用池内的變量内容
do
    (ping -W 1 -c 1 192.168.12.$i &> /dev/null && echo 192.168.12.$i) &      

4、案例:編寫檔案類型測試腳本,支援多個參數

[root@egon /]# cat file.sh 
#!/bin/bash

for i in $@    #$@表示所有的任意一個或多個
do
    if [[ -d $i ]];then        #目錄判斷
        echo "$i is directory."
    elif [[ -b $i  ]];then     
        echo "$i is block device."
    elif [[ -f $i ]];then
        echo "$i is a regular file."
    else
        echo "unknow."
    fi
done
[root@egon /]# chmod +x file.sh 
[root@egon /]# 
[root@egon /]# ./file.sh a.txt /etc /root /abc   #設定目錄進行查詢(可以一個或多個)
a.txt is a regular file.
/etc is directory.
/root is directory.
unknow.      

5、案例:可以直接在指令行編寫for循環

[root@egon /]#  for i in {1..10};do [ $i -eq 5 ] && continue || echo $i;done
[root@egon /]#  for i in {1..10};do [ $i -eq 5 ] && break || echo $i;done      

6、案例:統計dev下每種檔案類型的數量

#!/bin/bash
dir='/dev'
for i in `ls $dir`
do
    if [ -b $dir/$i ];then
        ((block++))  # 或者 let block++,下同
    elif [ -f $dir/$i ];then
        ((file++))
         
    elif [ -d $dir/$i ];then
        ((directory++))
    else
        ((unkown++))
    fi
done

echo 'block' $block
echo 'regular file' $file
echo 'directory' $directory
echo 'unkown'      

7、案例:檢查使用者

向腳本傳遞一個使用者名,驗證這個使用者是否存在.
[root@egon ~]# cat testuser.sh 
#!/bin/bash
id $1 &> /dev/null
if [ $? -eq 0 ];then
    echo "使用者$1存在"
else
    echo "使用者$1不存在"
fi
[root@egon ~]# ./testuser.sh root      

8、案例:使用者提添加與删除

for i in {1..30};
do
    useradd user$i&&echo "user$i create successful"
done


for i in {1..30};
do
    userdel -r user$i&&echo "user$i delete successful"      

9、案例:使用者建立編寫

[root@egon shell]# cat adduser.sh 
#!/bin/bash

read -p "請輸入建立的使用者名資訊: " name
read -p "請輸入建立的使用者數量: " count

for i in `seq -w $count`
do
    echo $name$i
    useradd $name$i &>/dev/null
    echo 123456 | passwd --stdin $name$i &>/dev/null
    id $name$i &>/dev/null
    [ $? -eq 0 ] && echo "$name$i create is ok" || echo "$name$i create is failed"      

10、案例:嵌套多層for循環,結合break與continue(了解)

1)#使用break:
break 預設參數是 1 
是以寫 break 等于 break 1
意義:退出目前循環層
break 2 則向上退出2層循環 目前循環也計算在退出層次裡

# 示例
for i in {0..3}
do
    echo -e "第一層循環:loop$i"
    for j in {0..3} 
    do
        echo -e "\t第二層循環:loop$j"
        for n in {0..3}
        do
            echo -e "\t\t第三層循環:loop$n:$i$j$n"
            if ((n==2));then
                break 3
            fi
        done
    done
done




2)#使用continue
continue = continue 1
在當次循環中忽略continue後續的代碼
就是:立即結束目前循環中的當次循環,而轉入目前循環的下一次循環

continue 2 等同于 break 1
continue 3 等同于 break 2
總結:continue n 等同于 break n-1

for i in {0..3}
do
    echo -e "第一層循環:loop$i"
    for j in {0..3} 
    do
        echo -e "\t第二層循環:loop$j"
        for n in {0..3}
        do
            echo -e "\t\t第三層循環:loop$n:$i$j$n"
            if ((n==2));then
                continue 3      

11、案列:編寫99乘法表(for)

#!/bin/bash

for x in {1..9}
do
    for y in {1..9}; do
        if (( $y <= $x ));then
            echo -en "$y*$x=$(($y*$x))\t"     #(echo -e \t)相當于tab鍵, (echo -n)取消換行符 
        let y++
        fi
    done
    echo ""
    
    let x++

done


[root@web01 opt]# sh hzl.sh 
1*1=1  
1*2=2  2*2=4  
1*3=3  2*3=6  3*3=9  
1*4=4  2*4=8  3*4=12  4*4=16  
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  


#案列二
#!/bin/bash
for ((j=1;j<=9;j++))
  do
for ((i=1;i<=j;i++))
  do
echo -e -n "${i}X${j}=$[${i}*${j}]\t"
  done
echo
done

[root@zabbix ~]# sh hzl.sh 
1X1=1  
1X2=2  2X2=4  
1X3=3  2X3=6  3X3=9  
1X4=4  2X4=8  3X4=12  4X4=16  
1X5=5  2X5=10  3X5=15  4X5=20  5X5=25  
1X6=6  2X6=12  3X6=18  4X6=24  5X6=30  6X6=36  
1X7=7  2X7=14  3X7=21  4X7=28  5X7=35  6X7=42  7X7=49  
1X8=8  2X8=16  3X8=24  4X8=32  5X8=40  6X8=48  7X8=56  8X8=64  
1X9=9  2X9=18  3X9=27  4X9=36  5X9=45  6X9=54  7X9=63  8X9=72  9X9=81      

繼續閱讀