1. 程式人生 > >Bash指令碼程式設計

Bash指令碼程式設計

 

函式

函式需要在使用之前定義;同時,函式支援以檔案的形式進行模組化封裝,其他檔案的呼叫正規化如下:

source base_func.sh
myFunc  # 模組函式呼叫

無參函式

常見的Bash函式,有兩種書寫方式

function myfunc {
    echo "abc"
}

function myfunc2(){
    echo "ABC"
}
注意:函式名後需要有一個空格!

函式返回值

方法1【棄用

通過return關鍵字處理返回資訊,主函式通過$?得到返回值:

function myfunc {
    read 
-p "Enter a value: " value # let value2=$value*2 # echo "Double $value = $value2" return $[ $value * 2 ] } myfunc echo "Get the function return-value: $?" # 通過$?獲取函式返回值

以下方式無法得到正確的返回值,請謹慎操作:

ret=`myfunc`  # 嘗試獲得myfunc函式的列印訊息
echo "Fail to get the return-value, but None: [$ret]
"

該方法是通過$?獲取返回值,然而,return關鍵字只能返回number型別,且退出狀態的取值範圍是0到255,所以return方式的返回值嚴格受限。一般來說,return只是用於表示退出狀態,而不作為返回值使用。

方法2【推薦】

通過echo返回字串,並利用$(function)捕獲函式返回值:

function help {
param=$1  # 外部傳參

    # echo "Usage : link-bin Target_Path Bin_FileName"  # 不應該有多個echo
    ret="echo string as return【$param】
" # 通過echo標準輸出返回值 echo $ret } echo_get=$(help param_abc) # 通過$()呼叫執行函式並接收返回 echo "Get the function echo_get: $echo_get"

該方法是捕獲函式內所有的echo語句作為return-value,比之方法1,返回值為字串格式,範圍不再受限。但函式如果需要返回,則需要人為地限制函式體內echo語句的使用(以及其他stdout輸出),否則會干擾函式的返回值正確性。

含參函式

編寫形式,如上示例。

需要注意變數在函式體內外的作用域變化:

param="Null"

function varfield {
    local param="abc"
    # param="123"  # 改寫Outer-param的值

    echo "In the function: param=[$param]"
}

varfield
echo "Out of function: param=[$param]"

關於陣列做實參、陣列作返回值

array=(5 4 3 2 1)
echo "The original array is: ${array[*]}"

function array_add {
local param_array=$*

    local array_new
    local index=0
    for value in ${param_array[*]}; do
        # echo "list[$index] = $value"
        param_array[$index]=$[ $value*2 ]  # 改寫原陣列
        let index+=1
        array_new+="$[ $value*2 ] "  # 利用字串組裝陣列
    done
    # echo ${param_array[*]}
    echo $array_new  # 或者通過組裝新的字串來表示陣列
}

array_ret=`array_add ${array[*]}`
echo "Get return array: ${array_ret[*]}"

index=0
for value in ${array_ret[*]}; do
    echo "list[$index]=$value"
    let index+=1
done

儘管bash-script提供了陣列的專有形式,但使用上與帶空格的字串沒有太大的差別。實際上,實參尚可以陣列格式傳入(當然也可以先整合為字串),但返回值只能利用echo,返回字串格式的“陣列”了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

function help(){ local param=$1    # 本地變數 ret_value="return string"    # 通過全域性變數返回 值       echo "Usage : link-bin Target_Path Bin_FileName"     echo "return value"    # 通過echo標準輸出返回值     exit }   echo_get=$(help xxx)    # 通過$()呼叫執行函式並接收返回