1、shell函式
1.1、shell函式定義
對於重複出現的程式碼,在shell中可以定義函式,然後在指定的地方呼叫即可。便於程式碼複用,提高開發效率。
定義函式的語法如下:
1 function 函式名(){ 2 語句塊 3 返回值 4 }
示例:
1 function hello(){ 2 echo "Hello" 3 }
2、呼叫函式
通過函式名稱來呼叫已定義的函式
1 function_name
兩個數相加的函式與定義:
1 #定義函式add 2 function add(){ 3 a=1 4 b=3 5 val=`expr ${a} + ${b}` 6 echo "${a} + ${b} is :${val}" 7 8 } 9 #呼叫函式 10 add
輸出:
1 1 + 3 is :4
1.3、帶引數的函式
上面的add函式a,b的值已寫死,可用性太差。下面傳入引數來重寫add函式
1 #定義函式add 2 function add(){ 3 #$1表示第一個引數 4 #$2表示第二個引數 5 #$n表示第n個引數 6 a=$1 7 b=$2 8 val=`expr ${a} + ${b}` 9 echo "${a} + ${b} is :${val}" 10 11 } 12 #呼叫函式 13 add 1 3 14 add 2 25
輸出:
1 1 + 3 is :4 2 2 + 25 is :27
1.4、函式返回值
1 #函式返回值不是必須的,與一般語言的返回值含義不同 2 #語法 return status_code,表示函式的退出狀態
#退出狀態是個數字,一般成功為0,失敗為1
#$? 用來獲取上一個命令的退出狀態或返回值。
1 #呼叫函式 2 add 1 2 3 echo "add func exit code is : $?"
輸出:
1 add func exit code is : 0
假如把add函式執行成功的退出狀態定義為200,重寫add函式並判斷是否執行成功
示例:
1 #定義函式add 2 function add(){ 3 #定義成功狀態碼 4 ok_code=200 5 err_code=100 6 a=$1 7 b=$2 8 val=`expr ${a} + ${b}` 9 if [ $? -eq 0 ] 10 then 11 return ${ok_code} 12 else 13 return ${err_code} 14 fi 15 16 } 17 #呼叫函式 18 add 1 e 19 if [ $? -eq 200 ] 20 then 21 echo "add func run sucess." 22 else 23 echo "add func run fail." 24 fi
輸出:
1 expr: 非整數引數 2 add func run fail.
1.5、如果獲取函式的處理結果
a、使用全域性變數
1 #定義函式add 2 function add(){ 3 #定義成功狀態碼 4 ok_code=200 5 err_code=100 6 a=$1 7 b=$2 8 val=`expr ${a} + ${b}` 9 if [ $? -eq 0 ] 10 then 11 return ${ok_code} 12 else 13 return ${err_code} 14 fi 15 16 } 17 #呼叫函式 18 add 1 2 19 echo "add 1 2 result is : ${val}"
輸出:
1 add 1 2 result is : 3
b、在函式內部echo 出變數,在函式外部用$(func_name arg1 argn)捕捉
1 #定義函式add 2 function add(){ 3 a=$1 4 b=$2 5 val=`expr ${a} + ${b}` 6 echo ${val} 7 } 8 #使用$(add 1 2)捕捉結果 9 echo "add 1 2 result is : $(add 1 2)"
輸出:
1 add 1 2 result is : 3
推薦使用第二種
1.6、break和continue
break用於退出迴圈,退出後迴圈不再執行。
cotinue用於退出本次迴圈,繼續執行下一次迴圈。
break示例:
1 #尋找1~10之間第一個偶數 2 #找到後即跳出迴圈,不再繼續 3 for i in `seq 1 10` 4 do 5 tmp=`expr ${i} % 2` 6 if [ ${tmp} -eq 0 ];then 7 echo $i 8 #continue 9 break 10 fi 11 done
break輸出:
1 2
continue示例:
1 #尋找1~10之間所有的偶數 2 for i in `seq 1 10` 3 do 4 tmp=`expr ${i} % 2` 5 if [ ${tmp} -eq 0 ];then 6 echo $i 7 continue 8 #下面這句echo永遠不會被執行 9 echo "statement after cotinue" 10 fi 11 done
cotinue輸出:
1 2 2 4 3 6 4 8 5 10