shell腳本編程——流程控制

shell腳本編程——流程控制

目   錄

一、 if 

二、 case

三、 for

四、 while

五、 until

六、 綜合應用


一、if

  1、語法

            1)單分支

            if  判斷條件;then

            fi

            (2)雙分支

            if 判斷條件; then

                條件爲真的分支代碼

            else

                條件爲假的分支代碼

            fi

            (3)多分支

            if 判斷條件1; then

                條件爲真的分支代碼

            elif 判斷條件2; then

                條件爲真的分支代碼

             elif 判斷條件3; then

                條件爲真的分支代碼

             else

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

             fi

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

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

#!/bin/bash
# ---------------------------------------------------------------
# Filename:checkint.sh
# Revision:     1.0
# Date:         2017-09-12
# Author:       gm
# Website:
# Description:check int
# -------------------------------------------------------------
read -p "please input number: " num
if [[ "$num" =~ [^[:digit:]] ]];then
        echo "The number is not a int"
else
        echo "The number is  a int"
fi

    解釋:如果輸入的數中匹配到了數字以外的字符,則提示不是自然數,其他情況,則提示是自然數。

        執行結果:

            wKioL1m-EqaQx6hQAAA02FG3meg745.png

二、case

    1、語法

    case 變量引用 in

    PAT1)

    分支1

    ;;

    PAT2)

    分支2

    ;;

    ...

    *)

    默認分支

    ;;

    esac


        case支持glob風格的通配符:

        *: 任意長度任意字符

        ?: 任意單個字符

        []:指定範圍內的任意單個字符

        a|b: ab

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

        

#!/bin/bash
# ------------------------------------------
# Filename:   menu.sh
# Revision:   1.0
# Date:       2017-9-11
# Description: cai dan
# ------------------------------------------
echo "menu
1.tang  
2.rice  
3.fruit  
4.jiaozi       
5.lamian       
6.huimian 
"     

read -p "plaese input your food  number: " num
case $num in
1|4)
     echo The price is 20

     ;;
2|5)
     echo The price is 12
     ;;
3|6) 
     echo The price is 10
     ;;
*)
     echo Please input again
     ;;                                                                                           
esac

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

執行結果:

    wKiom1m-EvHDMKOfAAAq6IDImBs206.png

三、for

    1、語法

    for 變量名 in 列表;do

    循環體

    done


        列表生成方式:

        (1)   直接給出列表

            例子3:打印1,2,3

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     a.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description: echo 1,2,3
# -------------------------------------------------------------
for line in 1 2 3;do                                                                    
     echo $line
done

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

         執行結果:

    wKioL1m-FCOQBZafAAAJxKa7Nss093.png

        (2) 整數列表:

            (a) {start..end}

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

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     aa.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:1+2+3+...+100                              
# -------------------------------------------------------------
sum=0
for i in {1..100};do
        let sum=sum+i
done
echo $sum

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

            執行結果:

                wKiom1m-FZbzVQYtAAAJ0oOTbec708.png 

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

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

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     bb.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:
# -------------------------------------------------------------
sum=0
for i in `seq 1 100`;do                                                                           
        let sum=sum+i
done
echo $sum

        解釋:seq 1 100 顯示出1-100個數,$(command)或者`command` 引用命令執行的結果。$(seq 1 100)將命令執行的結果作爲列表

         執行結果:

            wKiom1m-Fm7g_FLFAAAKCPzqVPE613.png

      (3) 返回列表的命令

    $(COMMAND)

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

(4) 使用glob 如: *.sh

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

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     cc.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:/var/log/*.log
# -------------------------------------------------------------
for file in /var/log/*.log;do
        wc -l $file                                  
done

執行結果:

    wKiom1m-GGHhjp2lAABK7-pJHlk063.png

    (5) 變量引用;

    $@, $*   

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     dd.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:1+2+3+..+n
# -------------------------------------------------------------
sum=0
for i in `seq 1 $1`;do                                                                            
        let sum=sum+i
done
echo $sum

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

    執行結果:

        wKioL1m-GaOQpyhfAAAaLF8Pqk4714.png

    

四、while

    1、語法

           while CONDITION; do

        循環體

      done

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

    例子1

            

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     ee.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:
# -------------------------------------------------------------
while true;do
          echo "hello"
done


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

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

    wKiom1m-GyyQ-A-6AAAIaT8lTPU078.png

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

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     ff.sh
# Revision:     1.0
# Date:         2017-09-17
# Author:       gm
# Website:
# Description:
# -------------------------------------------------------------
i=1
sum=0                                                                                             
while [ $i -le 100 ];do
        let sum=sum+i
        let i++
done
echo $sum

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

執行結果:

    wKiom1m-HHWDTiyXAAAJq7jzScc482.png

五、until

    1、語法

      until CONDITION; do

        循環體

      done

    進入條件: CONDITION false

    退出條件: CONDITION true

    例子:當發現系統中有用戶名爲hacker ,立即讓該用戶退出登錄           

#!/bin/bash
# ---------------------------------------------------------------
# Filename:     login.sh
# Revision:     1.0
# Date:         2017-09-13
# Author:       gm
# Website:
# Description:  test user login
# -------------------------------------------------------------
until who|grep -q "^hacker\>";do                                                                  
        sleep 1
done
pkill -9 -u hacker

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

    執行結果:當登錄上hacker用戶後,

    

    wKioL1m-HsfyQMuiAAAIAu1SVXg855.png

    執行該腳本,立即執行完

    wKiom1m-HvbjctU_AAAMFmoJeLk828.png

    再次查看hacker登錄,已經被踢出登錄

    wKioL1m-HsfxXgvWAAAFmTQt4BY843.png

六、綜合應用

        1、對於上面例子中的menu,用戶只能輸入一次就退出,這裏通過多種語法相結合,實現用戶多次輸入(while 與case結合)

        

#!/bin/bash
# ------------------------------------------
# Filename:menu.sh
# Revision: 1.0
# Date: 2017-9-11
# Description: caidan
# ------------------------------------------
echo "menu
1.yangroutang  
2.mifan        
3.hulatang     
4.jiaozi       
5.lamian       
6.huimian 
"     

while read -p "plaese input your food  number(quit is exit): " num;do
        case $num in
        1|4)
                echo The price is 20

                ;;
        2|5)
                echo The price is 12
                ;;
        3|6) 
                echo The price is 10
                ;;
        quit) 
                exit
                ;;

        *)
                echo Please input again
                ;;
        esac
done


 執行結果:

            wKiom1m-IpuQo1okAABRCDbY3Zw905.png

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

    

#!/bin/bash
# ------------------------------------------
# Filename:xiangqi.sh 
# Revision: 1.0
# Date: 2017-9-11
# Description: 
# ------------------------------------------
huang=`echo -e "\033[1;43m      \033[0m"`
lan=`echo -e "\033[1;44m      \033[0m"`
hong=`echo -e "\033[1;41m      \033[0m"`
for i in {1..24};do
        num=`echo $[($i-1)/3]`
        mo=$[num%2]
        case  $mo in
        0)                                                                                                      
                for  j in {1..4};do
                         echo -n  "$huang$lan"
                done
                echo
                ;;
        *)
                for  j in {1..4};do
                         echo -n  "$lan$huang"
                done
                echo
                ;;
        esac   
  
done
unset huang lan hong num

    執行結果:

    wKioL1m-JHDCYaUuAABJ9S2ShWM233.png

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章