循環結構

循環結構

循環執行:
    講一段代碼重復執行一次或多次
    
    進入條件:條件滿足時進入循環
    退出條件:每一個循環都應該有退出條件,以有機會退出循環;
    
    
    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 20:42
下一篇 2016-08-21 20:45

相關推薦

  • MAN 手冊各章節功能介紹及快捷鍵鍵位整理

    MAN 手冊各章節功能介紹及快捷鍵鍵位整理   Linux提供了豐富的幫助手冊,當你需要查看某個命令的參數時不必到處上網查找,只要man一下即可。  1、Linux 的man手冊共有以下幾個章節:         1章節:用戶命令     …

    Linux干貨 2016-10-19
  • read,locate ,find 的總結及相關聯系

    read 變量名 read 變量名1 [變量名2] < 文件名不支持管道read 變量名1 [變量名2] <<< “值1 [值2] …”使用read來把輸入值分配給一個或者多個shell變量     -p 指定要顯示的提示     # read -p…

    Linux干貨 2017-08-12
  • HAProxy實戰(一)

    實驗目的 測試基于haproxy的反代和負載均衡配置 測試keepalived高可用haproxy的效果 實驗要點 (1) 動靜分離discuzx,動靜都要基于負載均衡實現;(2) 進一步測試在haproxy和后端主機之間添加varnish緩存;(3) 給出拓撲設計;(4) haproxy的設定要求: (a) 啟動stats;(b) 自定義403、502和5…

    Linux干貨 2017-02-13
  • 編譯安裝httpd

    編譯安裝httpd   1 去官網下載源碼包                                      為避免非法軟件,一定要去官網下載http…

    2017-04-24
  • 馬哥教育網絡班21期+第8周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 集線器 集線器也稱HUB,工作在OSI七層結構的第一層物理層,屬于共享型設備,接收數據廣播發出,在局域網內一般都是星型連接拓撲結構,每臺工作站都連接到集線器上。 由于集線器的帶寬共享特性導致網絡利用效率極低,一般在大中型的網絡中不會使用到集線器。 網橋 網橋(Bridge)也稱橋…

    Linux干貨 2016-09-01
  • Linux包管理:rpm/yum/編譯安裝

    rpm:安裝,查詢,升級,校驗,卸載   Topic: 程序包 rpm管理 yum管理   程序包:   什么是程序包管理器: 將編譯好的應用程序的各個組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作   程序包的組成清單: 文件清單 安裝或卸載時運行的腳本 數據庫(公共) …

    2017-09-14

評論列表(1條)

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

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

欧美性久久久久