bash編程函數select語句的使用

£select      

      select循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,并顯示PS3提示符,等待用戶的輸入,用戶輸入菜單列表中的某個數字,執行相應的命令,用戶輸入被保存在變量REPLY中。

select是個無限循環,因此要記住用break命令退出循環,或者用exit直接退出腳本,也可以使用ctrl+c退出循環

 

select語句結構:

    select 變量 in 選項1 選項2 ;do

    break

    done

 

    #!/bin/sh

    PS3="what is you favourite OS?:"

    select i  in "Linux" "Windows" "Mac";do

    echo "you have select $REPLY"

    break

    done

1.jpg

 

selectif選擇語句的使用

    #!/bin/bash

    #

    PS3="please input a color:"

    select  color  in   red  white   black  ; do

         if [[ "$color" == "red" ]];then

         echo  " is  good"         

         elif [[ "$color" ==  "white"  ]] ;then

                   echo   "is ok "

         elif [[ "$color"  == "black" ]];then

                   echo "is god"

         fi

    break

    done

2.jpg

 

selectcase

    #!/bin/bash

    #

    PS3="please input a color:"

    select  color  in   “red”  “white”   “black”  ; do

         case $color in

         red)

         echo “is goog”

         ;;

         white)

         echo “is ok”

         ;;

         black)

         echo “is god”

         ;;

         *)

         exit

         esac

         done

 

    break

    done

 

3.jpg

 

 

函數

       函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程,最大化的代碼重用和最小化的代碼冗余,它與shell程序形式上是相似的,不同的是他不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。函數是

函數和shell程序的差異

shell程序在子shell中運行,而shell函數在當前shell中運行,因此在當前shell中,函數可以shell中變量進行修改

函數由兩部分組成:函數名和函數體

  語法一:

      function  f_name {

   函數體

      }

  語法二:

     function f_name () {

  函數體

     }

 語法三:

   f_name (){

  函數體

  }

函數有兩種返回值:

  函數的執行結果返回值:

(1)       使用echoprintf命令進行輸出

(2)       函數體中調用命令的輸出結果

函數的退出碼狀態:

(1)       取決于函數中執行的最后一條命令的退出狀態碼

(2)       自定義退出狀態碼,其格式為:

return 從函數中返回,用最后狀態命令決定返回值

return 0 無錯誤返回

return 1-255 有錯誤返回

 

 

  函數使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell首次發現它后才能使用

調用時直接使用函數名即可,如下例子

 

利用函數來顯示當前系統的主機名

 1.jpg

利用函數顯示用的uidshell類型

 2.jpg

  有時候我們會經常進行某些操作,每次重新寫一遍太耗時,有了函數我們就可將要執行的操作定義在函數中,這樣在我們想執行某些操作的時候,直接來調用函數來完成操作,如果是多個函數,那么可以定義在一個文件當中,然后將函數載入shell,文件名可任意取,但最好跟某些任務有某種關聯,這樣用的時候也好找一些。

  一旦函數文件載入shell,就可以在命令或腳本中調用函數??梢允褂?/span>set命令查看所有定義的函數,其輸出列表包括已經載入shell的所有函數

  若要改動函數,首先用unst命令從shell中刪除函數,改動完畢后,再重新載入此文件

 

載入函數的方法

      . filename source filename兩者的區別是前者里定義的變量不會加載到環境變量中,而后者恰恰相反

 

刪除函數的方法

  使用unset function_name跟刪除變量一樣

5.png

 

£函數參數

  傳遞參數給函數:調用函數時,在函數名后面以空白分隔給定參數列表即可;例如“testfunc arg1 arg2 …

在函數體中當中,可使用$1, $2, …調用這些參數;還可以使用$@, $*, $#等特殊變量,注意:如果函數中有局部變量,如果其名稱同本地變量,使用局部變量

 

 

    1、斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……,斐波納契數列以如下被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)n2

寫一個函數,求n階斐波那契數列

    #!/bin/bash

    #

    fab() {

         if [ $1 -eq 1 ] ;then

         echo -n  "1 "

         elif  [ $1 -eq 1 ] ;then

                   echo  -n "1 "

         else

                   echo  -n "$[$(fab $[$1-1]) + $(fab $[$1-2] ) ] "

        fi

    }

    for i in {1..10};do

         fab $i

    echo

    done

 

6.png

 

 

       2、漢諾塔(又稱河內塔)問題是源于印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

利用函數,實現N片盤的漢諾塔的移動步驟

    #!/bin/bash
    #
    step=0
    move (){
    let step++
    echo "$step:  move disk $1   $2 —–> $3"
    }
    hanoi(){
        if [ $1 -eq  1 ];then
            move  $1   $2  $4
        else
    hanoi "$[$1-1]" $2 $4 $3
    move $1  $2  $4
    hanoi  "$[$1-1]" $3  $2  $4
    fi
    }
    read -p "please input the  number of plates: "  number
    hanoi $number A B C

QQ截圖20160823104247.jpg

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

(0)
fszxxxksfszxxxks
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • DNS原理詳解02

    9、子域授權     1、在父域的區域配置文件中增加以下記錄,即為增加了子域授權            opt.patrickli.com.         IN      NS     &…

    Linux干貨 2016-08-29
  • 高可用+LVS-NAT

    關鍵:floating VIP 要以組為單位同時切換 實驗1: 主備VRRP 切換實驗 預期: 設定配置文件: A主機 (172.18.48.61) vrrp_sync_group VG1 { group { outside_network inside_network } } vrrp_instance outside_network { state MA…

    2017-05-14
  • LVS-NAT負載均衡兩個php應用(wordpress,discuzx)( Blog 19)

    結果:需要會話保持,需要共享存儲;

    Linux干貨 2017-12-20
  • NET25_第6周作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; (1) cp /etc/rc.d/rc.sysinit /tmp cd /tmp vim rc.sysint vim命令::%s/\(^[[:space:]]\)\+/#\…

    Linux干貨 2017-03-15
  • linux中軟鏈接和硬鏈接簡單說明

    linux鏈接文件 在 Linux 上文件系統被分成兩個部分:數據 (user data) 與元數據 (metadata)。數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如:文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其并不包含…

    Linux干貨 2016-12-05
  • lvs-dr 原理與配置

    Lvs-dr 原理與配置 目錄     1、ARP介紹     2、DR模式數據包請求響應流程     3、配置過程    4、總結 1、ARP協議介紹 功能:局域網內,根據IP地址獲取MAC地址。 互聯網上面…

    Linux干貨 2015-09-16
欧美性久久久久