1. 函數建立與使用html
建立格式:shell
function name { name() {編程
commands 或 commands數組
} }bash
調用: 直接寫函數名就能夠調用ide
1 [Hermioner@localhost Documents]$ cat test2.sh 2 #!/bin/bash 3 func1() { 4 lss 5 echo "hello" 6 } 7 func1 8 echo $? 9 [Hermioner@localhost Documents]$ bash test2.sh 10 test2.sh: line 3: lss: command not found 11 hello 12 0 13 [Hermioner@localhost Documents]$
note:用標準變量$?來肯定函數的退出狀態碼,它默認是返回的是函數中的最後一條命令的退出狀態碼,即便函數中間有錯誤。----------很危險函數
能夠有兩種辦法來改進:return 和使用函數輸出ui
(1)使用return命令spa
函數調用和狀態碼輸出語句中什麼別的語句都不添加的話,函數調用的返回結果將代替狀態碼中的值,不然,就會返回最後一條語句的狀態碼。.net
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f1 { 4 read -p "Please enter a value:" value 5 echo "double the value" 6 return $[ $value*2 ] 7 } 8 9 f1 10 11 echo "The new value is $?" 12 [Hermioner@localhost Documents]$ bash test1.sh 13 Please enter a value:3 14 double the value 15 The new value is 6 16 [Hermioner@localhost Documents]$ bash test1.sh 17 Please enter a value:200 18 double the value 19 The new value is 144 20 [Hermioner@localhost Documents]$ 21 #這種狀況函數的返回值做爲$?的值,可是任何大於256的值都會產生一個錯誤的值,函數的返回值不能夠大於256.由於退出狀態碼的值必須是0-255.
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f1 { 4 read -p "Please enter a value:" value 5 echo "double the value" 6 return $[ $value*2 ] 7 } 8 9 f1 10 echo "hello" 11 echo "The new value is $?" 12 [Hermioner@localhost Documents]$ bash test1.sh 13 Please enter a value:3 14 double the value 15 hello 16 The new value is 0 17 #這種狀況是函數的返回值並無在$?顯示出來
(2)使用函數輸出----整數,浮點,字符串都適用
能夠將函數的輸出保存在變量中。
1 [Hermioner@localhost Documents]$ cat test2.sh 2 #!/bin/bash 3 function f2 { 4 read -p "Pleas enter a value: " value 5 echo $[ $value*2 ] 6 } 7 result=$(f2) 8 echo "The reuslt is $result" 9 [Hermioner@localhost Documents]$ bash test2.sh 10 Pleas enter a value: 3 11 The reuslt is 6 12 [Hermioner@localhost Documents]$
2. 在函數中使用變量
(1)向函數傳遞參數
在腳本中指定函數時,必須將參數和函數放在同一行。
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f1 { 4 echo $1 5 } 6 #value=$(f1 $1) 7 value=$(f1) 8 echo "the new value is $value" 9 10 11 [Hermioner@localhost Documents]$ bash test1.sh 12 the new value is 13 [Hermioner@localhost Documents]$ bash test1.sh 3 14 the new value is 15 #腳本中在調用函數時沒有使用$1
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f1 { 4 echo $1 5 } 6 value=$(f1 $1) 7 #value=$(f1) 8 echo "the new value is $value" 9 10 11 [Hermioner@localhost Documents]$ bash test1.sh 12 the new value is 13 [Hermioner@localhost Documents]$ bash test1.sh 3 14 the new value is 3 15 #在函數調用時採用了$1傳入參數
note:必須在腳本中也手動傳參
(2)在函數中處理變量
全局變量和局部變量的處理。在函數內部變量或者變量賦值前面寫上local,就能夠看成局部變量處理,不然,默認當成全局變量處理。
全局變量在shell腳本中任何地方都是有效的變量。若是你在腳本的主體部分定義了一個全局變量,那麼能夠在函數內讀取它的值。相似地,若是你在函數內定義了一個全局變量,能夠在腳本的主體部分讀取它的值。
默認狀況下,你在腳本中定義的任何變量都是全局變量。在函數外定義的變量能夠在函數內正常訪問。
1 [Hermioner@localhost Documents]$ cat htest.sh 2 #!/bin/bash 3 function f1{ 4 temp=$[ $value + 5 ] 5 result=$[ $temp * 2 ] 6 } 7 temp=4 8 value=6 9 f1 10 echo "The result is $result" 11 if [ $temp -gt $value ] 12 then 13 echo "temp is larger" 14 else 15 echo "temp is smaller" 16 fi 17 18 19 ./htest.sh 20 The result is 22 21 temp is larger 22 若是在temp前面加了local,輸出爲: 23 The result is 22 24 temp is smaller
3. 數組變量和函數
(1)向函數傳數組參數
相似變量傳入
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f1 { 4 local newarry 5 newarry=(echo $@) 6 echo "The new arry value is: ${newarry[*]}" 7 } 8 myarry=(1 2 3 4 5) 9 echo "The original array is ${myarry[*]}" 10 #f1 ${myarry[*]} 11 f1 $myarry 12 [Hermioner@localhost Documents]$ bash test1.sh 13 The original array is 1 2 3 4 5 14 The new arry value is: echo 1 15 [Hermioner@localhost Documents]$
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f1 { 4 local newarry 5 newarry=(echo $@) 6 echo "The new arry value is: ${newarry[*]}" 7 } 8 myarry=(1 2 3 4 5) 9 echo "The original array is ${myarry[*]}" 10 f1 ${myarry[*]} 11 #f1 $myarry 12 [Hermioner@localhost Documents]$ bash test1.sh 13 The original array is 1 2 3 4 5 14 The new arry value is: echo 1 2 3 4 5 15 [Hermioner@localhost Documents]$
(2)從函數返回數組
參考博客: https://blog.csdn.net/guizaijianchic/article/details/78012179
4. 函數遞歸
好比計算4的階乘 x!=x*(x-1)!
1 [Hermioner@localhost Documents]$ cat test1.sh 2 #!/bin/bash 3 function f { 4 if [ $1 -eq 1 ] 5 then 6 echo 1 7 else 8 local temp=$[ $1-1 ] 9 local result=$(f $temp) 10 echo $[ $result*$1 ] 11 fi 12 } 13 read -p "Please enter a value: " value 14 result=$(f $value) 15 echo "The final result is: $result" 16 [Hermioner@localhost Documents]$ bash test1.sh 17 Please enter a value: 4 18 The final result is: 24 19 [Hermioner@localhost Documents]$
5. 建立庫
將經常使用的函數定義成庫函數,這樣在不一樣的目錄下能夠調用這個函數。
1 [Hermioner@localhost ~]$ bash testfile 2 the result is 25 3 [Hermioner@localhost ~]$ cat testfile 4 #!/bin/bash 5 source /home/Hermioner/Documents/myfuncs 6 result=$(addem 10 15) 7 echo "the result is $result"
其中的source能夠用點號代替。注意路徑必定要對。
note:也能夠在命令行上建立函數,可是一旦退出shell,這個函數就消失了。爲了不這個缺點,能夠在.bashrc文件中來自定義庫函數。可是這個文件中已經又發行版本定義好的庫函數,當心操做。
參考文獻:
Linux命令行與shell腳本編程大全(第3版)[美] 布魯姆(Richard Blum),佈雷斯納漢(Christine Bresnahan) 著,門佳,武海峯 譯