shell指令碼函式宣告,呼叫
阿新 • • 發佈:2019-01-07
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=