1. 程式人生 > >shell指令碼函式宣告,呼叫

shell指令碼函式宣告,呼叫

shell指令碼中函式的宣告, 呼叫,處理結果的返回等問題。 

1. 函式宣告

1.1 函式需要先聲明後呼叫, 宣告和呼叫有順序要求。

1.2 shell中的函式返回值只能是數字, 返回0表示執行成功, 返回其他型別的值時會報錯:numeric argument required

1.3 因函式返回值被限制的問題, 所以需要定義全域性變數來獲取函式的處理結果。

1.4 函式的呼叫方式: 函式名 引數列表

demo:

#全域性變數:字串去除前後空格的結果
trimResult=""

#函式宣告:trim字串
function trim(){
    #字串為空不處理
    if [ -z "$1" ]; then
        trimResult=""
    else 
        #去除字串前後的空格
        trimResult=$(echo $1|awk '{sub(/^ */,"");sub(/ *$/,"")}1')
    fi
}

 #函式呼叫: 獲取第一個“-”之後的trim之後的字串, 字串可能有空格, 所以用引號包括
 trim "$(echo ${temp#*-})"

#函式處理結果使用
echo "trim之後的內容為:$trimResult"

*****問題:shell預設空格為分隔符, 如果傳遞的引數中有空格,則會被認為是多個引數。

有兩種解決方法:

方式一:使用引號將引數包括起來

#傳遞帶有空格的引數
trim "first paramter"

方式二:重置預設分隔符

#!/bin/sh

function test(){
 echo "all [email protected]"
 echo "param_a=$1"
 echo "param_b=$2"
}
param1="aa bb"
echo 'invoke: test $param1, '"param1=$param1"
test $param1

param2="11 22"
echo 'invoke: test "$param2", '"param2=$param2"
test "$param2"
#備份預設分隔符
IFS_BAK=$IFS
#指定新的分隔符
IFS="!!"
echo 'change default separator, invoke: test $param1,'" param1=$param1"
test $param1
#恢復系統預設分隔符
IFS=$IFS_BAK

執行結果:  由結果可知,使用引號或者修改預設分隔符後, 帶空格的引數結構不會被破壞

invoke: test $param1, param1=aa bb
all params=aa bb
param_a=aa
param_b=bb
invoke: test "$param2", param2=11 22
all params=11 22
param_a=11 22
param_b=
change default separator, invoke: test $param1, param1=aa bb
all params=aa bb
param_a=aa bb
param_b=