shell 函式定義

hurp_oracle發表於2015-01-20
函式的定義和基本知識
向函式傳遞引數
函式返回值
函式呼叫:指令碼放置多個函式;函式相互調用;一個函式呼叫多個函式
區域性變數和全域性變數
函式遞迴:使用區域性變數的遞迴;不使用區域性變數的遞迴
函式的定義和基本知識
函式是一串命令的集合,函式可以把大的命令集合分解成若干較小的任務。程式設計人員可以基於函式進一步的構造更復雜的Shell 程式,而不需要重複編寫相同的程式碼。下面給出了Linux Shell中函式的基本形式
                function_name()
               {
                    command1
                    command2
                    …    
                    commandN
                }
對函式結構進行解釋:
其中標題:函式名,函式體:函式內的命令集合,在編寫指令碼時要注意標題名應該唯一,如果不唯一,指令碼執行時會產生錯誤。
在函式名前可以加上關鍵字function,但加上和省略關鍵字function對指令碼的最終執行不產生任何影響。
函式體中的命令集合必須含有至少一條命令,即函式不允許空命令,這一點和C語言不同。
函式之間可透過引數、函式返回值互動,函式在指令碼中出現的次序可以是任意的,但是必須按照指令碼中的呼叫次序執行這些函式。
向函式傳遞引數
在bash Shell程式設計中,向函式傳遞的引數仍然是以位置引數的方式來傳遞的,而不能傳遞陣列等其它形式變數,這與C語言或Java語言中的函式傳遞是不同的。
#function4.sh
#!/bin/bash

half()
{
     let "n = $1"
     let "n = n/2"
     echo "In function half() n is $n"
}

let "m = $1"
echo "Before the function half() is called, m is $m"
half $m
echo "After the function half() is called, m is $m"
在Linux Shell程式設計中,函式還可傳遞間接引數,但該方式傳遞方式遠遠沒有C語言和Java語言靈活,而只能使用第9章所述的間接變數引用來傳遞引數,這種方式是一種笨拙的間接引數傳遞方式。其中表示式expr1為迴圈變數賦初值的語句

#function6.sh
#!/bin/bash

ind_func()
{
    echo " $1"
}

parameter=ind_arg
ind_arg=Hello

ind_func "$parameter"

ind_func "${!parameter}"

echo "***********************"

ind_arg=World
ind_func "$parameter"
ind_func "${!parameter}"

函式返回值
有時需要指令碼執行完成後返回特定的值來完成指令碼的後繼操作,這些特定的值就是函式返回值。在Linux Shell程式設計中,函式透過return返回其退出狀態,0表示無錯誤,1表示有錯誤。在指令碼中可以有選擇的使用return語句,因為函式在執行完最後一條語句後將執行呼叫該函式的地方執行後繼操作。

#function7.sh
#!/bin/bash

show_week()
{
     echo -n "What you input is: "
     echo "$1"

    case $1 in 
    0)
        echo "Today is Sunday. "
        return 0;;
    1)
        echo "Today is Monday. "
        return 0;;
    2)
        echo "Today is Tuesday. "
        return 0;;
    3)
        echo "Today is Wednesday. "
        return 0;;
    4)
        echo "Today is Thursday. "
        return 0;;
    5)
        echo "Today is Friday. "
        return 0;;
    6)
        echo "Today is Saturday. "
        return 0;;
    *)
        return 1;;
    esac
}

if show_week "$1"
then
    echo "What you input is right! "
else 
    echo "What you input is wrong! "
fi
exit 0
指令碼放置多個函式
可以在指令碼中放置多個函式,指令碼執行時按照呼叫函式的順序執行這些函式.
#function9.sh
#!/bin/bash

show_week()
{
    for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday
    do
        echo  -n "$day "
    done
    echo ""
}

show_number()
{
    for(( integer = 1; integer <= 7; integer++ ))
    do
        echo -n "$integer "
    done
     
    echo ""
}

show_square()
{
    i=0
    
    until [[ "$i" -gt 7 ]]
    do
        let "square=i*i"
        echo "$i * $i = $square"
        let "i++"
    done
}

show_week
show_number
show_square
函式相互呼叫
在Linux Shell程式設計中,函式之間可以相互呼叫,呼叫時會停止當前執行的函式轉去執行被呼叫的函式,直到呼叫的函式執行完,再返回當前函式繼續執行。
一個函式呼叫多個函式
在Linux Shell程式設計中允許一個函式呼叫多個函式,在該函式呼叫其他函式時同樣需要按照呼叫的順序來執行呼叫的函式。
區域性變數和全域性變數
在Linux Shell程式設計中,可以透過local關鍵字在Shell函式中宣告區域性變數,區域性變數將侷限在函式範圍內。此外,函式也可呼叫函式外的全域性變數,如果一個區域性變數和一個全域性變數名字相同,則在函式中區域性變數將會覆蓋掉全域性變數
函式遞迴
Linux Shell中可以遞迴呼叫函式,即函式可以直接或間接呼叫其自身。在遞迴呼叫中,主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。例13-12是一個遞迴呼叫的例子。
                             #例13-12:function12.sh演示了一個函式遞迴呼叫
                             #!/bin/bash
 
                              #遞迴呼叫函式
                              foo()
                             {
                                    read y
                                    foo $y
                                    echo "$y"
                              }
 
                              #呼叫函式
                            foo
                            exit 0

使用區域性變數進行遞迴一般是針對數值執行來使用的。階乘運算是一個使用區域性變數的遞迴呼叫過程,實現了n! 的運算,其可以透過下面的公式表示:
                    n!=1           (n=0)
                    n!=n*(n-1)!      (n>=1)
按照該公式可實現對階乘的運算,由於該階乘運算中存在終止條件“0!=1”,所以可以使用函式遞迴來實現該運算。

#function13.sh
#!/bin/bash

fact ()
{
    local num=$1
    
    if [ "$num" -eq 0 ]
    then
        factorial=1
    else
        let "decnum=num-1"

        fact $decnum

        let "factorial=$num * $?"
    fi
    return $factorial
}

fact $1
echo "Factorial of $1 is $?"

exit 0

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-1408008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章