shell編程值之函數和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

wKioL1e66cXQjoFdAABSGOLfjX8172.jpg-wh_50

 

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

wKioL1e66dai61IjAAB1tpmudc8913.jpg-wh_50

 

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

 wKioL1e66faBvp9sAABPFPsHH2g459.jpg-wh_50


 

 

函數

   函數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首次發現它後才能使用

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


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

 wKiom1e67BbgiLkGAAATWCB98nY387.png-wh_50


利用函數顯示用的uidshell類型

 wKiom1e67CGAZbcrAAAeyDJNe00223.png-wh_50

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

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

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

 

載入函數的方法

. filename source filename(兩者之間的差別,在於前者定於變量不會加載到環境變量中去,而後者則加入到環境變量中)

 

刪除函數的方法

使用unset function_name跟刪除變量一樣

wKiom1e66nbApo4tAAAezqLTA0Y448.png-wh_50

 

函數參數

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

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

 

 

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

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

#!/bin/bash

#

fab() {

    if[ $1 -eq 1 ] ;then

        echo-n  "1 "

    elif  [ $1 -eq 2 ] ;then

        echo -n "1 "

    else

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

    fi

     }

  for i in {1..10};do

     fab$i

     echo

  done

 

 wKiom1e66pmx2_AmAABBynNGjss176.png-wh_50

 

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

wKioL1e66snwEMslAABBynNGjss388.png-wh_50




 

 


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