天天看點

shell腳本程式設計——流程控制shell腳本程式設計——流程控制 一、if   1、文法     解釋:如果輸入的數中比對到了數字以外的字元,則提示不是自然數,其他情況,則提示是自然數。 二、case三、for四、while五、until六、綜合應用

目   錄

一、 if 

二、 case

三、 for

四、 while

五、 until

六、 綜合應用

            (1)單分支

            if  判斷條件;then

            fi

            (2)雙分支

            if 判斷條件; then

                條件為真的分支代碼

            else

                條件為假的分支代碼

            (3)多分支

            if 判斷條件1; then

            elif 判斷條件2; then

             elif 判斷條件3; then

             else

                以上條件都為假的分支代碼

             fi

        逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而後結束整個if語句

       2、例子1:編寫腳本,實作如下功能:當輸入的是自然數,提示是自然數,如果輸入不是,則提示,輸入不是自然數。

<code>#!/bin/bash</code>

<code># ---------------------------------------------------------------</code>

<code># Filename:checkint.sh</code>

<code># Revision:     1.0</code>

<code># Date:         2017-09-12</code>

<code># Author:       gm</code>

<code># Website:</code>

<code># Description:check int</code>

<code># -------------------------------------------------------------</code>

<code>read</code> <code>-p </code><code>"please input number: "</code> <code>num</code>

<code>if</code> <code>[[ </code><code>"$num"</code> <code>=~ [^[:digit:]] ]];</code><code>then</code>

<code>        </code><code>echo</code> <code>"The number is not a int"</code>

<code>else</code>

<code>        </code><code>echo</code> <code>"The number is  a int"</code>

<code>fi</code>

        執行結果:

    1、文法

    case 變量引用 in

    PAT1)

    分支1

    ;;

    PAT2)

    分支2

    ...

    *)

    預設分支

    esac

        case支援glob風格的通配符:

        *: 任意長度任意字元

        ?: 任意單個字元

        []:指定範圍内的任意單個字元

        a|b: a或b

2、例子2:寫出菜單,當使用者輸入菜單編号,則顯示出價格

<code># ------------------------------------------</code>

<code># Filename:   menu.sh</code>

<code># Revision:   1.0</code>

<code># Date:       2017-9-11</code>

<code># Description: cai dan</code>

<code>echo</code> <code>"menu</code>

<code>1.tang  </code>

<code>2.rice  </code>

<code>3.fruit  </code>

<code>4.jiaozi       </code>

<code>5.lamian       </code>

<code>6.huimian </code>

<code>"     </code>

<code>read</code> <code>-p </code><code>"plaese input your food  number: "</code> <code>num</code>

<code>case</code> <code>$num </code><code>in</code>

<code>1|4)</code>

<code>     </code><code>echo</code> <code>The price is 20</code>

<code>     </code><code>;;</code>

<code>2|5)</code>

<code>     </code><code>echo</code> <code>The price is 12</code>

<code>3|6) </code>

<code>     </code><code>echo</code> <code>The price is 10</code>

<code>*)</code>

<code>     </code><code>echo</code> <code>Please input again</code>

<code>     </code><code>;;                                                                                           </code>

<code>esac</code>

解釋:通過讀取使用者輸入的數字;如果是1或4 ,提示The price is 20 。因為2号商品和4号商品價格一樣,可以寫在一起。case支援glob風格。當不滿足以上三個case時,用*)表示出以上情況,其他的輸入都提示 Please input again

執行結果:

    for 變量名 in 清單;do

    循環體

    done

        清單生成方式:

        (1)   直接給出清單

            例子3:列印1,2,3

<code># Filename:     a.sh</code>

<code># Date:         2017-09-17</code>

<code># Description: echo 1,2,3</code>

<code>for</code> <code>line </code><code>in</code> <code>1 2 3;</code><code>do</code>                                                                    

<code>     </code><code>echo</code> <code>$line</code>

<code>done</code>

   解釋:line是變量名,可以換成其他名 

         執行結果:

        (2) 整數清單:

            (a) {start..end}

              例子4:計算1+2+3+...+100                    

<code># Filename:     aa.sh</code>

<code># Description:1+2+3+...+100                              </code>

<code>sum</code><code>=0</code>

<code>for</code> <code>i </code><code>in</code> <code>{1..100};</code><code>do</code>

<code>        </code><code>let</code> <code>sum</code><code>=</code><code>sum</code><code>+i</code>

<code>echo</code> <code>$</code><code>sum</code>

    解釋:let 使用于變量的運算

            執行結果:

      (b) $(seq [start[step]] end)

             例子5:計算1+2+3+...+100                

<code># Filename:     bb.sh</code>

<code># Description:</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 100`;</code><code>do</code>                                                                           

        解釋:seq 1 100 顯示出1-100個數,$(command)或者`command` 引用指令執行的結果。$(seq 1 100)将指令執行的結果作為清單

      (3) 傳回清單的指令

    $(COMMAND)

        (2)中的seq也是指令的引用

(4) 使用glob, 如: *.sh

            例子6:依次顯示出/var/log/下所有以.log 結尾檔案的行數            

<code># Filename:     cc.sh</code>

<code># Description:/var/log/*.log</code>

<code>for</code> <code>file</code> <code>in</code> <code>/var/log/</code><code>*.log;</code><code>do</code>

<code>        </code><code>wc</code> <code>-l $</code><code>file</code>                                  

    (5) 變量引用;

    $@, $*   

<code># Filename:     dd.sh</code>

<code># Description:1+2+3+..+n</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 $1`;</code><code>do</code>                                                                            

    解釋:引用使用者輸入參數作為清單,$1表示使用者輸入的第一個參數。更加的靈活,注意:這裡不能使用{1..$1},{}引用變量顯示不出來,可以用`seq 1 $1`。

    執行結果:

           while CONDITION; do

        循環體

      done

    CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀态為“false”終止循環

    例子1:

<code># Filename:     ee.sh</code>

<code>while</code> <code>true</code><code>;</code><code>do</code>

<code>          </code><code>echo</code> <code>"hello"</code>

解釋:true 一直為真,是以會一直執行循環體,是以這是個死循環。而且執行後,最好立即按ctrl+c停下,這是個死循環,不會自己停下,最終會造成系統資源耗盡而四級

執行結果:由于執行速度太快,我迅速按下ctrl+c後已經向上翻不到執行腳本的指令了,執行腳本指令./dd.sh

例子2:計算1+2+3+…+100       

<code># Filename:     ff.sh</code>

<code>i=1</code>

<code>sum</code><code>=0                                                                                             </code>

<code>while</code> <code>[ $i -</code><code>le</code> <code>100 ];</code><code>do</code>

<code>        </code><code>let</code> <code>i++</code>

解釋:當i小于或等于100時,執行下面操作。

      until CONDITION; do

    進入條件: CONDITION 為false

    退出條件: CONDITION 為true

    例子:當發現系統中有使用者名為hacker ,立即讓該使用者登出           

<code># Filename:     login.sh</code>

<code># Date:         2017-09-13</code>

<code># Description:  test user login</code>

<code>until</code> <code>who</code><code>|</code><code>grep</code> <code>-q </code><code>"^hacker\&gt;"</code><code>;</code><code>do</code>                                                                  

<code>        </code><code>sleep</code> <code>1</code>

<code>pkill -9 -u hacker</code>

    解釋:who|grep -q "^hacker\&gt;" 查找使用者名為hacker,當沒有找到時,一直循環,休眠1秒,sleep 1,一旦發現hacker使用者。直接讓使用者登出,腳本執行完立即退出

    執行結果:當登入上hacker使用者後,

    執行該腳本,立即執行完

    再次檢視hacker登入,已經被踢出登入

        1、對于上面例子中的menu,使用者隻能輸入一次就退出,這裡通過多種文法相結合,實作使用者多次輸入(while 與case結合)

<code># Filename:menu.sh</code>

<code># Revision: 1.0</code>

<code># Date: 2017-9-11</code>

<code># Description: caidan</code>

<code>1.yangroutang  </code>

<code>2.mifan        </code>

<code>3.hulatang     </code>

<code>while</code> <code>read</code> <code>-p </code><code>"plaese input your food  number(quit is exit): "</code> <code>num;</code><code>do</code>

<code>        </code><code>case</code> <code>$num </code><code>in</code>

<code>        </code><code>1|4)</code>

<code>                </code><code>echo</code> <code>The price is 20</code>

<code>                </code><code>;;</code>

<code>        </code><code>2|5)</code>

<code>                </code><code>echo</code> <code>The price is 12</code>

<code>        </code><code>3|6) </code>

<code>                </code><code>echo</code> <code>The price is 10</code>

<code>        </code><code>quit) </code>

<code>                </code><code>exit</code>

<code>        </code><code>*)</code>

<code>                </code><code>echo</code> <code>Please input again</code>

<code>        </code><code>esac</code>

 執行結果:

2、列印棋盤(for 和case 結合)

<code># Filename:xiangqi.sh </code>

<code># Description: </code>

<code>huang=`</code><code>echo</code> <code>-e </code><code>"\033[1;43m      \033[0m"</code><code>`</code>

<code>lan=`</code><code>echo</code> <code>-e </code><code>"\033[1;44m      \033[0m"</code><code>`</code>

<code>hong=`</code><code>echo</code> <code>-e </code><code>"\033[1;41m      \033[0m"</code><code>`</code>

<code>for</code> <code>i </code><code>in</code> <code>{1..24};</code><code>do</code>

<code>        </code><code>num=`</code><code>echo</code> <code>$[($i-1)</code><code>/3</code><code>]`</code>

<code>        </code><code>mo=$[num%2]</code>

<code>        </code><code>case</code>  <code>$mo </code><code>in</code>

<code>        </code><code>0)                                                                                                      </code>

<code>                </code><code>for</code>  <code>j </code><code>in</code> <code>{1..4};</code><code>do</code>

<code>                         </code><code>echo</code> <code>-n  </code><code>"$huang$lan"</code>

<code>                </code><code>done</code>

<code>                </code><code>echo</code>

<code>                         </code><code>echo</code> <code>-n  </code><code>"$lan$huang"</code>

<code>        </code><code>esac</code>   

<code>  </code> 

<code>unset</code> <code>huang lan hong num</code>

本文轉自 hawapple 51CTO部落格,原文連結:http://blog.51cto.com/guanm/1966049