《Linux命令行與shell腳本編程大全》創建函數
基本的腳本函數
創建函數
1.用function關鍵字,後面跟函數名
[plain]
function name {
commands
}
2.函數名後面跟空圓括號,標明正在定義一個函數
[plain]
name() {
commands
}
如果兩個函數的名稱相同,那麼後面的將會覆蓋前面的,而且不會有提示。
使用函數
使用函數名稱即可。必須先定義,再使用。
[plain]
#!/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還沒有定義,所以會調用失敗。
[plain]
$ function_test
this is f1.
this is f1111.
./function_test: line 12: f2: command not found
返回值
bash shell會把函數當做小型腳本,運行結束時會返回一個退出狀態碼。
有三種方式生成函數退出狀態碼
默認退出狀態碼
默認情況下,函數的退出狀態碼是函數中最後一條命令返回的退出狀態碼
函數執行結束後,可以使用$?變量來決定函數的退出狀態碼
[plain]
#!/bin/bash
fun(){
ls nothing
echo $?
echo "done"
}
fun
echo "fun:$?"
由於ls找不到nothing文件或者目錄,所以返回的狀態碼=2
但是fun函數最後的echo執行成功了,所以fun返回的狀態碼=0
[plain]
$ 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
在函數中使用變量
向函數傳遞參數
在腳本中指定函數時,必須將參數和函數放在同一行
然後函數可以用參數環境變量來獲得參數值
在函數中處理變量
函數會用到全局變量和局部變量。
全局變量
在腳本中定義的所有變量均為全局變量。
[plain]
#!/bin/bash
var=1
fun(){
echo "var:"$var
var2=2
}
fun
echo "var2:"$var2
輸出:
[plain]
$ function_test
var:1
var2:2
局部變量
函數內部任何變量都可以聲明為局部變量,只需在變量前加local關鍵字即可。
在腳本中定義的局部變量,函數中是無法訪問的。
數組變量和函數
向函數傳遞數組參數
需要將數組變量的值分解成單個值,然後作為函數參數使用。
在函數內部,可以將他們再組成一個數組。
[plain]
#!/bin/bash
array=(a b c d)
fun(){
newarray=($@) #重新組合為數組
echo "newarray is:"${newarray[*]} #打印數組
echo "The 3rd element is:"${newarray[3]}
}
fun ${array[*]} #拆分成多個值傳入
輸出:
[plain]
$ function_test
newarray is:a b c d
The 3rd element is:d
如果試圖將數組當做一個參數傳遞給函數,那麼函數只會讀取數組變量的第一個值。
[plain]
#!/bin/bash
array=(a b c d)
fun(){
echo "We have "$#" parameter(s)."
echo "They are: "$@
echo "They are: "$*
}
fun $array
fun函數只認識數組中的第一個元素
[plain]
$ function_test
We have 1 parameter(s).
They are: a
They are: a
從函數返回數組
[plain]
#!/bin/bash
fun(){
local array=(a b c d)
echo ${array[*]}
}
array=(`fun`)
echo ${array[2]}
同返回普通字符串類似,按順序echo輸出,然後放在圓括號裡面即可。
函數遞歸
還是以最簡單的求N的階乘為例:
[plain]
#!/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函數
[plain]
#!/bin/bash
plus(){
if [ $# -ne 2 ]
then
echo "I need 2 numbers!"
return
fi
echo $[$1 + $2]
}
然後我們在另一個腳本中使用它
[plain]
#!/bin/bash
. lib_test #腳本路徑
plus $1 $2
使用方法很簡單,這樣就相當於把lib_test導入到當前文件中了
[plain]
$ function_test 4 5
9
在命令行上使用函數
在命令行上創建函數
由於在鍵入命令時shell就會解釋命令,所以可以在命令上直接定義函數。
[plain]
$ plus(){ echo $[$1 + $2]; }
$ plus 3 1
4
注意:要在花括號兩邊加空格,每條命令用分號隔開。
下面的方法看起來更實用一些,效果也更好
[plain]
$ plus(){
> echo $[$1 + $2]
> }
$ plus 4234 23
4257
無須分號和空格。
在.bashrc文件中定義函數
可以直接在這裡定義函數,也可以使用source命令,導入庫
注意,修改了.bashrc之後要重啟才能生效
如果不是每次開機都要執行,那我們還可以在shell中直接使用source,很多時候,這種方式可能更好一些。