Bash指令碼程式設計
阿新 • • 發佈:2018-12-12
函式
函式需要在使用之前定義;同時,函式支援以檔案的形式進行模組化封裝,其他檔案的呼叫正規化如下:
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) # 通過$()呼叫執行函式並接收返回