shell之函數

一 函數shell

    函數與shell腳本沒有明顯區別,但在執行時有本質區別:bash

    對於一個單獨的shell腳本,執行時爲其建立一個新的shell進程,並解釋並執行腳本中代碼函數

    當腳本執行完成,該shell進程自動結束this

    對於函數來講,調用時不會單首創建一個shell進程,而是在調用者的shell進程中直接解釋並執行函數中的代碼命令行

    函數定義:遞歸

    function_name()進程

    {ip

           statement1get

    }string

    (也能夠加function關鍵字,函數在調用前必須定義)

    例子:

    #! /bin/bash

    #定義函數

    functionsayhello()

    {

       echo "Hello, World!"

    }

    #調用函數

    sayhello

    函數調用:

    function_nameparam1 param2

    函數連接:

    在某個shell函數中調用另一個函數的過程

    例子:

    #! /bin/bash

    #定義函數john()

    john()

    {

       echo "Hello, this is John."

    }

    #定義函數alice

    alice()

    {

       #調用函數john

       john

       echo "Hello, this is Alice."

    }

    #調用函數alice

    alice

    結果:Hello, this is John.

             Hello,this is Alice.

     

    函數返回值:

    shell能夠用return語句來返回某個數值,只能返回0-255直接整數值,函數中的return語句其實是用來返回函數的退出狀態碼

    例子:

    #! /bin/bash

    #定義求和函數

    sum()

    {

       let "z = $1 + $2"

       #將和做爲退出狀態碼返回

       return "$z"

    }

    #調用求和函數

    sum 22 4

    #輸出和

    echo"$?"

    結果:26

    (超過255會出錯,如sum 253 4)

    設置別名:

    alias name=」command」

    (name爲要指定的名,command爲原有shell命令)

    函數和別名區別:

    用戶不能爲一組命令指定別名

    別名中不能經過系統變量操做參數列表

    不用某個別名時,unalisa name

二 函數參數
 2.2 獲取函數參數個數

    經過$#來獲取腳本參數的個數

    #! /bin/bash

    #定義函數

    func()

    {

       #輸出參數個數

       echo "the function has $#parameters."

    }

    #調用函數

    func a b c d e f ghello

    func 12 3"hello world"

    func

    (若參數中有空格,要用引號引發來)

 2.2 經過位置變量接收參數值:

    $0:腳本名稱

    $1:第一個參數

    $2:第二個參數

    $@和$*:全部參數

    例:

    #! /bin/bash

     #定義函數

    func()

    {

       #輸出全部的參數hello world

       echo "all parameters are $*"

       #輸出全部的參數hello world

       echo "all parameters are $@"

       #輸出腳本名稱

       echo "the script's name is $0"

       #輸出第1個參數 hello

       echo "the first parameter is $1"

       #輸出第2個參數 world

       echo "the second paramter is $2"

    }

    #調用函數

    func hello world

2.3 移動位置參數

    shift命令使腳本全部參數左移一個位置

    #! /bin/bash

    #定義函數

    func()

    {

       #經過while循環和shift命令依次獲取參數值,$#獲取傳遞給函數的參數個數

       while (($# > 0))

       do

    #shift命令參數位置左移一個,原來的第二個參數會變成第一個,每次輸出$1就能夠了

          echo "$1"  

          shift

        done

    }

 2.4 經過getopts接收函數參數

    getopts獲取函數的選項以及參數值,或者是腳本的命令行選項以及參數值

    getopts optstring[args]

    參數optstring包含一個能夠爲getopts命令識別的選項名稱列表。若是某個選項名稱的後面跟隨着一個冒號,則表示用戶能夠爲該選項提供參數值,同時參數值被保存到名稱爲$OPTARG的系統變量中。

    getopts依次遍歷每一個選項,選項名稱被保存到args變量中。

    #! /bin/bash

    #定義函數

    func()

    {

       #逐個接收選項及其參數

       while getopts "a:b:c" arg

       do

          #當指定了-a選項時

          case "$arg" in

             a)

                #輸出-a選項的參數值

                echo "a's argument is$OPTARG"

                ;;

             b)

                echo "b's argument is$OPTARG."

                ;;

             c)

                echo "c"

                ;;

             ?)

                #未知選項

                echo "unkown argument."

                exit 1

                ;;

          esac

       done

    }

    #調用函數

    func -a hello -bworld

    結果:a's argument is hello

          b's argument is world

    (a,b後面有冒號,能夠含有參數,c不含參數,循環過程當中,當前選項名稱被保存到arg中,選項的參數值被保存到系統變量$OPTARG中。當用戶提供-c選項是,只是簡單輸出字符c)

 2.5 間接參數傳遞:

    經過間接變量引用來實現函數的參數的傳遞。若是某個變量的值又是另一個變量的變量名,則該變量稱爲間接變量。

    var=name

    name=john

    第二個變量能夠用兩種方式引用:

    ${name}

    ${!var}

    (shell中間接引用語法爲${!var_name})

 三 函數庫文件

    腳本與庫文件之間的區別在於函數庫文件只包括函數,腳本能夠即包括函數和變量的定義,又包括執行的代碼。

    庫文件有主程序載入並執行,用戶無需擁有庫文件的執行權限,只要讀權限就能夠。

3.1 函數庫文件的調用

. filename(圓點和文件名之間有空格)

    #! /bin/bash

    #載入函數庫

    . lib.sh

    #定義變量

    msg="the fileis not found."

    #調用函數庫中的函數

    error $msg

    lib.sh文件:

    #! /bin/bash

    #定義函數

    error()

    {

    #1和2都是文件描述符,1爲標誌輸出,2標準錯誤輸出,>&複製一個輸出描述符

       echo "ERROR:" $@ 1>&2

    }

    warning()

    {

       echo "WARNING:" $@ 1>&2

    }

    結果:ERROR:the file is not found

3.2 遞歸函數

    調用過程就是反覆的調用本身

    #! /bin/bash

    #定義遞歸函數

    fact()

    {

       #定義局部變量

       local n="$1"

       #當n等於0時終止遞歸調用

       if [ "$n" -eq 0 ]

       then

          result=1

       else

          #當n大於0時,遞歸計算n-1的階乘

          let "m=n-1"

          fact "$m"

          let "result=$n * $?"

       fi

       #將計算結果以退出狀態碼的形式返回

       return $result

    }

    #調用遞歸函數

    fact"$1"

    echo"Factorial of $1 is $?"

相關文章
相關標籤/搜索