shell基礎07 函數

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]$
View Code

     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.
View Code
 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 #這種狀況是函數的返回值並無在$?顯示出來
View Code

(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]$
View Code

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
View Code
 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傳入參數
View Code

         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
View Code

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]$ 
View Code
 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]$ 
View Code

(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]$ 
View Code

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"
View Code

其中的source能夠用點號代替。注意路徑必定要對。

        note:也能夠在命令行上建立函數,可是一旦退出shell,這個函數就消失了。爲了不這個缺點,能夠在.bashrc文件中來自定義庫函數。可是這個文件中已經又發行版本定義好的庫函數,當心操做。

 

參考文獻

Linux命令行與shell腳本編程大全(第3版)[美] 布魯姆Richard Blum),佈雷斯納漢Christine Bresnahan) 著,門佳武海峯 譯

相關文章
相關標籤/搜索