《Linux命令行與shell腳本編程大全》 第十六章 學習筆記

第一部分:Linux命令行
《Linux命令行與shell腳本編程大全》 第一章:初識Linux shell
《Linux命令行與shell腳本編程大全》 第二章:走進shell
《Linux命令行與shell腳本編程大全》 第三章:基本的bash shell命令
《Linux命令行與shell腳本編程大全》 第四章:更多的bash shell命令
《Linux命令行與shell腳本編程大全》 第五章:使用Linux環境變量
《Linux命令行與shell腳本編程大全》 第六章:理解Linux文件權限
《Linux命令行與shell腳本編程大全》 第七章:管理文件系統
《Linux命令行與shell腳本編程大全》 第八章:安裝軟件程序
《Linux命令行與shell腳本編程大全》 第九章:使用編輯器

第二部分:shell腳本編程基礎
《Linux命令行與shell腳本編程大全》 第十章:構建基本腳本
《Linux命令行與shell腳本編程大全》 第十一章:使用結構化命令
《Linux命令行與shell腳本編程大全》 第十二章:更多的結構化命令
《Linux命令行與shell腳本編程大全》 第十三章:處理用戶輸入
《Linux命令行與shell腳本編程大全》 第十四章:呈現數據
《Linux命令行與shell腳本編程大全》 第十五章:控制腳本

第三部分:高級shell編程
《Linux命令行與shell腳本編程大全》 第十六章:創建函數
《Linux命令行與shell腳本編程大全》 第十七章:圖形化桌面上的腳本編程
《Linux命令行與shell腳本編程大全》 第十八章:初識sed和gawk
《Linux命令行與shell腳本編程大全》 第十九章:正則表達式
《Linux命令行與shell腳本編程大全》 第二十章:sed進階
《Linux命令行與shell腳本編程大全》 第二十一章:gawk進階
《Linux命令行與shell腳本編程大全》 第二十二章:使用其他shell

第四部分:高級shell腳本編程主題
《Linux命令行與shell腳本編程大全》 第二十三章:使用數據庫
《Linux命令行與shell腳本編程大全》 第二十四章:使用Web
《Linux命令行與shell腳本編程大全》 第二十五章:使用E-mail
《Linux命令行與shell腳本編程大全》 第二十六章:編寫腳本實用工具
《Linux命令行與shell腳本編程大全》 第二十七章:shell腳本編程進階


第十六章:創建函數

 

基本的腳本函數

創建函數

1.用function關鍵字,後面跟函數名

function name {
    commands
}

2.函數名後面跟空圓括號,標明正在定義一個函數

name() {
   commands
}

如果兩個函數的名稱相同,那麼後面的將會覆蓋前面的,而且不會有提示。

使用函數

使用函數名稱即可。必須先定義,再使用。

#!/bin/bash
f1() {
    echo "this is f1."
}
f1

function f1 {
    echo "this is f1111."
}
f1

f2
f2() {
    echo "this is f2."
}

這裏首先定義了f1,然後執行,然後又定義了一個f1,再執行。發現第二次執行的是新的f1函數。

接着調用f2,由於此時f2還沒有定義,所以會調用失敗。

$ function_test 
this is f1.
this is f1111.
./function_test: line 12: f2: command not found

返回值

bash shell會把函數當做小型腳本,運行結束時會返回一個退出狀態碼。

有三種方式生成函數退出狀態碼

默認退出狀態碼

默認情況下,函數的退出狀態碼是函數中最後一條命令返回的退出狀態碼

函數執行結束後,可以使用$?變量來決定函數的退出狀態碼

#!/bin/bash
fun(){
    ls nothing
    echo $?
    echo "done"
}

fun
echo "fun:$?"

由於ls找不到nothing文件或者目錄,所以返回的狀態碼=2

但是fun函數最後的echo執行成功了,所以fun返回的狀態碼=0

$ function_test 
ls: cannot access nothing: No such file or directory
2
done
fun:0

使用函數默認退出狀態碼是很危險的……

 

使用return命令

bash shell使用return命令退出函數並返回特定的退出狀態碼。

return命令允許指定一個整數值來定義函數的退出狀態碼

注意:函數一結束就取返回值,退出狀態碼必須在0-255之間。

使用函數輸出

可以將函數的輸出保存到變量中,例如:

result=`f1`

bash shell不會將read讀取輸入的部分作爲 STDOUT

 

在函數中使用變量

向函數傳遞參數

在腳本中指定函數時,必須將參數和函數放在同一行

然後函數可以用參數環境變量來獲得參數值

在函數中處理變量

函數會用到全局變量和局部變量。

全局變量

在腳本中定義的所有變量均爲全局變量。

#!/bin/bash
var=1
fun(){
    echo "var:"$var
    var2=2
}

fun
echo "var2:"$var2

輸出:

$ function_test 
var:1
var2:2

局部變量

函數內部任何變量都可以聲明爲局部變量,只需在變量前加local關鍵字即可。

在腳本中定義的局部變量,函數中是無法訪問的。

 

數組變量和函數

向函數傳遞數組參數

需要將數組變量的值分解成單個值,然後作爲函數參數使用。

在函數內部,可以將他們再組成一個數組。

#!/bin/bash
array=(a b c d)

fun(){
    newarray=($@) #重新組合爲數組
    echo "newarray is:"${newarray[*]} #打印數組
    echo "The 3rd element is:"${newarray[3]}
}

fun ${array[*]} #拆分成多個值傳入

輸出:

$ function_test 
newarray is:a b c d
The 3rd element is:d

如果試圖將數組當做一個參數傳遞給函數,那麼函數只會讀取數組變量的第一個值。

#!/bin/bash
array=(a b c d)

fun(){
    echo "We have "$#" parameter(s)."
    echo "They are: "$@
    echo "They are: "$*
}

fun $array

fun函數只認識數組中的第一個元素

$ function_test 
We have 1 parameter(s).
They are: a
They are: a

從函數返回數組

#!/bin/bash
fun(){
    local array=(a b c d)
    echo ${array[*]}
}

array=(`fun`)
echo ${array[2]}

同返回普通字符串類似,按順序echo輸出,然後放在圓括號裏面即可。

 

函數遞歸

還是以最簡單的求N的階乘爲例:

#!/bin/bash
fun(){
    local result=1;
    if [ $1 -eq 1 ]
    then
        echo 1
    else
        result=$[$1 * `fun $[$1 - 1]`]
        echo $result
    fi
}

fun $1

沒有新的知識點,只是不太熟悉罷了

如果使用了``,那麼函數內的echo就不會輸出到STDOUT了,和上面其他的例子一樣。

 

創建庫

source命令可以在當前的shell上下文中執行命令,而不是創建一個新的shell來執行命令。可以用source命令來在shell腳本中運行庫文件腳本。

source命令等同於點操作符(dot operator)

在一個名叫lib_test的文件中定義一個plus函數

#!/bin/bash
plus(){
    if [ $# -ne 2 ]
    then
        echo "I need 2 numbers!"
        return
    fi
    echo $[$1 + $2]
}

然後我們在另一個腳本中使用它

#!/bin/bash
. lib_test #腳本路徑
plus $1 $2

使用方法很簡單,這樣就相當於把lib_test導入到當前文件中了

$ function_test 4 5
9

在命令行上使用函數

在命令行上創建函數

由於在鍵入命令時shell就會解釋命令,所以可以在命令上直接定義函數。

$ plus(){ echo $[$1 + $2]; }
$ plus 3 1
4

注意:要在花括號兩邊加空格,每條命令用分號隔開。

下面的方法看起來更實用一些,效果也更好

$ plus(){
> echo $[$1 + $2]
> }
$ plus 4234 23
4257

無須分號和空格。

在.bashrc文件中定義函數

可以直接在這裏定義函數,也可以使用source命令,導入庫

注意,修改了.bashrc之後要重啓才能生效

如果不是每次開機都要執行,那我們還可以在shell中直接使用source,很多時候,這種方式可能更好一些。

 

 

 

轉貼請保留以下鏈接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章