shell指令碼--建立函式
阿新 • • 發佈:2019-02-04
轉自:http://www.2cto.com/os/201309/240741.html
主要是ubuntu格式 其他版本略有不同
基本的指令碼函式
建立函式
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=([email protected]) #重新組合為陣列
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: " [email protected]
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,很多時候,這種方式可能更好一些。