循環結構

循環結構

循環執行:
    講一段代碼重復執行一次或多次
    
    進入條件:條件滿足時進入循環
    退出條件:每一個循環都應該有退出條件,以有機會退出循環;
    
    
    bash腳本有三種循環方式:        
        for循環:        
        while循環:
        until循環:        
    for循環:
        兩種格式:
            (1)遍歷列表的格式
            (2)通過控制變量來控制循環次數的方式
            
        遍歷列表:            
        for VARAIBLE in LIST;do
                循環體            
        done
            
            
            進入條件:只要列表有可用元素,即可進入循環。
            退出條件:列表中的元素遍歷完成
            
        LIST的生成方式:
            (1):直接給出
            (2):整數列表
                (a){start..end}
                (b)seq [start] [incremtal] last
            (3)返回列表的命令
            (4)glob
            (5)變量引用                
                $@  $#
        #!/bin/bash
        #
        for username in user24 user25 user26; do
                if id $username &> /dev/null;then
                        echo "$username exists"
                else
                        useradd $username && echo "Add user $username finished."
                fi
        
        done

    
    
        [root@localhost ~]# bash -x /root/for/for1.sh
        + for username in user24 user25 user26
        + id user24
        + useradd user24
        + echo 'Add user user24 finished.'
        Add user user24 finished.
        + for username in user24 user25 user26
        + id user25
        + useradd user25
        + echo 'Add user user25 finished.'
        Add user user25 finished.
        + for username in user24 user25 user26
        + id user26
        + useradd user26
        + echo 'Add user user26 finished.'
        Add user user26 finished.

        上面是簡單的使用for循環的方式
        
        
    實例:求100以內所有正整數之和;        #!/bin/bash
        #
        declare -i sum=0
        for i in {1..100};do
                sum=$[$sum+$i]        
        done
        echo $sum

    [root@localhost ~]# bash /root/for/sum.sh
    5050
    
    
    
    while循環:        
        while CONDITION; do
                循環體        
        done
    
    CONDITION :循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true” ,則執行一次循環;直到條件測試狀態為“false” 終止循環
    
    因此:CONDTION 一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
    
    進入條件:CONDITION 為true;
    退出條件:CONDITION 為false
    
    until循環:
        until CONDITION; do
            循環體        
        done
    進入條件: CONDITION  為false 
    退出條件: CONDITION  為true
    
        循環控制語句:continue
    用于循環體中    
    continue [N] :提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層        
        while CONDTIITON1; do
            CMD1
            ...            
            if CONDITION2; then
                continue
            fi
            CMDn
            ...        
       done
        
    實例:        
        #!/bin/bash
        #
        #
        #
        i=0
        while [ $i -lt 9 ];do
                let i++
                [ $i -eq 5 ] && continue
                echo "$i"
        done
        
        [root@localhost ~]# bash /root/tiaochu/continue.sh
        1
        2
        3
        4
        6
        7
        8
        9
        [root@localhost ~]# 
        
    前期運行錯誤分析:
        代碼如下:            
            #!/bin/bash
            #
            #
            #
            i=0
            while [ $i -lt 9 ];do
                    [ $i -eq 5 ] && continue
                    echo "$i"
                    let i++            
            done
        
        運行結果如下:
            [root@localhost ~]# bash /root/tiaochu/continue.sh
            0
            1
            2
            3
            4
        腳本沒有跳出本次循環執行下次循環,也沒有退出程序。
        分析后得出結果:在循環中,代碼let i++寫在了continue跳出語句的后面,導致變量i的值一直處于符合跳出條件i=5,所以每次執行的都是跳出本次循環的操作。無法執行下面的let i++。修改后如此前寫的那樣,程序正常運行。在后面的操作中要注意此類問題。?。。。。?!



循環控制語句:break  
    用于循環體中    
     break [N] :提前結束第N層循環,最內層為第1層       
      while CONDTIITON1; do 
            CMD1
            ...            
            if CONDITION2; then
                break
            fi
            CMDn
            ...        
     done
        
    實例:        
        #!/bin/bash
        #
        #
        #
        i=0
        while [ $i -lt 9 ];do
                [ $i -eq 5 ] && break
                echo "$i"
                let i++        
        done
    
    [root@localhost ~]# bash /root/tiaochu/continue.sh
    0
    1
    2
    3
    4
    [root@localhost ~]# 
    
    對于在使用continue中遇到的問題,在break語句中不會出現同樣的情況,應為continue語句是跳出當前正在執行的本輪循環,而break語句是跳出整個循環程序。


創建無限循環    
    while true; do
        循環體    
    done

     until false; do
        循環體    
     done
     
     
     
   1 、判斷/var/ 目錄下所有文件的類型	
filetype.sh
#!/bin/bash
#
for filename in /var/* ;do
if [[ -S $filename ]];then
echo "Socket file"
elif [[ -L $filename ]];then
echo "Symbolic file"
elif [[ -d $filename ]];then
echo "Directory file"
elif [[ -b $filename ]];then
echo " Block special file"
elif [[ -c $filename ]];then
echo "character special file"
elif [[ -p $filename ]];then
echo "Named pipe file"
elif [[ -f $filename ]];then
echo "Common file"
else
echo "Other file"
fi
done
2、 、 添加10個  用戶user1-user10 ,密碼 同 用戶名	
useradd.sh
#!/bin/bash
#
for username in {20..30};do
if id user$username &> /dev/null;then
echo "user$username"|passwd --stdin user$username &> /dev/null
else
useradd user$username
echo "user$username"|passwd --stdin user$username &> /dev/null
echo "add user user$username finished."
fi
done
3 、/etc/rc.d/rc3.d 目錄下分別有多個以K 開頭和以S 開頭的
文件 ;分別 讀取每個文件,以K 開頭的文件輸出為文件加stop
,以S 開頭的文件輸出為文件名加start; ;
“ “K34filename stop”
“S66filename start”
fileadd.sh
#!/bin/bash
#
for filename in /etc/rc.d/rc3.d/*;do
if [[ $filename =~ /.*/+[kK].*$ ]];then
echo "$filename" |sed -r 's@/.*/+([kK].*)$@\1@' &> /dev/null
echo "${filename}stop"
elif [[ $filename =~ /.*/+[sS].*$ ]];then
echo "$filename" |sed -r 's@/.*/+([Ss].*)$@\1@' &> /dev/null
echo "${filename}start"
else
echo "Other"
fi
done
4 、編寫腳本 ,提示輸入正整數n 的值,計算1+2+3+…n 的總
和
numsum.sh
#!/bin/bash
#
read -p "enter a integer::" num
sum=0
if [ -n $num -a $num -gt 0 ];then
expr $num + 0 &> /dev/null
if [ `echo $?` -eq 0 ];then
for i in `seq 1 $num`;do
sum=$[$sum+$i]
done
echo "$sum"
else
echo "enter a integer"
fi
else
echo "enter a integer"
fi
5、 、 打印九九乘法表
chengfabiao.sh
#!/bin/bash
#
#!/bin/bash
#
#
read -p "請輸入要打印的行數::" n
echo "=========================================="
for i in `seq $n`
do
        kd=$[$n-$i]
        for k in `seq $kd`
        do
                echo -n " "
        done
        qd=$[2*$i-1]
        for q in `seq $qd`
        do
                echo -n "*"
        done
        echo
done

echo "=========================================="
for  ((i=1;i<=n;i++))
do
        for  ((k=1;k<=n-i;k++))
        do
                echo -n " "
        done
        for  ((j=1;j<=2*i-1;j++))
        do
                echo -n "*"
        done
        echo
done
echo "=========================================="
i=1
while [ $i -le $n ]
do
        j=1
        k=$[$n-$i]
        while [ $j -le $k ]
        do
                echo -n " "
                ((j++))
        done
        q=1
        qd=$[2*$i-1]
        while [ $q -le $qd ]
        do
                echo -n "*"
                ((q++))
        done
        echo
        ((i++))
done
echo "=========================================="
i=1
until [ $i -gt $n ]
do      j=1
        k=$[$n-$i]
        until [ $j -gt $k ]
        do
                echo -n " "
                ((j++))
        done
        q=1
        qd=$[2*$i-1]
        until [ $q -gt $qd ]
        do
                echo -n "*"
                ((q++))
        done
        echo
        ((i++))
done
echo "=========================================="

原創文章,作者:dxkboke,如若轉載,請注明出處:http://www.www58058.com/38586

(0)
dxkbokedxkboke
上一篇 2016-08-21
下一篇 2016-08-21

相關推薦

  • yum安裝 源碼安裝實例

     yum安裝 源碼安裝實例 §·源碼安裝 http 2.2.29實例 1     1.下載源碼包。 1     2.配置系統需要的編譯環境。 2     3 ./configure ; make  ;…

    Linux干貨 2016-08-24
  • Redis 存儲分片之代理服務Twemproxy 測試

    概述 實際業務場景中單點 Redis 容量、并發都是有限的,所以有 Redis Cluster 的需求。 但是官方的 Redis Cluster 一再跳票,還不可用。 只好先使用最簡單的方式:Proxy。有很多可選,但在大范圍生產使用的, Twitter 開源的 Twemproxy  看起來是個理想的選擇 – https://…

    Linux干貨 2015-03-10
  • 文本處理工具 grep

    文件查看:       文件查看命令:cat,tac,rev               cat [OPTION]… [FILE]…            …

    Linux干貨 2016-08-07
  • linux 文件管理類命令及功能用法

    第一題:Linux上的文件管理類命令都有哪些,其常用的使用方法及相關示例演示。 文件管理類的命令有: cd,ls,touch,mldir,cp,mv,rm,rmdir,pwd,tree 使用方法 (1),cd命令用來切換工作目錄至dirname。其中dirName表示法可為絕對路徑或相對路徑。 常用格式: cd #進入用戶家目錄 cd~ #進入用戶家目錄 c…

    Linux干貨 2017-07-09
  • shell腳本編程初步–吐血整理

    shell腳本編程 編程基礎 程序: 程序的構成:指令 + 數據 程序的編程風格:     過程式:以指令為中心,數據服務于指令     對象式:以數據為中心,指令服務于數據 shell程序:提供了編程能力,解釋執行 shell,perl,python語言均為高級編程語言 編程的邏輯處理方式: &n…

    Linux干貨 2016-08-18
  • Linux系統的介紹及如何獲取幫助?(學習筆記)

    第一、Linux 基礎   CPU架構:      x86      x64 (amd64)      m68000,m68k      arm    &nbs…

    Linux干貨 2016-12-12

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-22 13:55

    腳本的學習沒有捷徑,再理清楚基本語法后剩下的是多寫,多看優秀代碼,這樣才能寫出優秀的腳本,建議有時間去找找一些生產環境中實用的腳本,學習寫寫,作業完成的很好,繼續保持。

欧美性久久久久