基本指令碼函式
1、建立函式
有兩種格式可以用來在bash shell指令碼中建立函式。
第一種採用關鍵字function。後跟分配給該程式碼的函式名。
function name { commands }
name屬性定義了賦予函式唯一的名稱。指令碼中定義的每個函式都必須有一個唯一的名稱。
commands是構成函式的一條或多條bash shell命令。在呼叫該函式時,bash shell會按命令在函式中出現的順序依次執行,就像在普通指令碼中一樣。
在bash shell指令碼中定義函式的第二種格式更接近於其他程式語言中定義函式的方式。
name(){ conmmands }
函式名後的空括號表明正在定義的是一個函式。這種格式的命名規則和之前定義shell指令碼函式的格式一樣。
2、使用函式
要在指令碼中使用函式,只需要向其他shell命令一樣,在行中指定函式名就行。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { echo "hello everyone!" } count=1 while [ $count -le 5 ] do func1 count=$[ $count + 1 ] done [root@node1 ljy]# sh ceshi.sh hello everyone! hello everyone! hello everyone! hello everyone! hello everyone!
返回值
有3種不同的方法來為函式生成退出狀態碼。
1、預設退出狀態碼
預設情況下,函式的退出狀態碼是函式中最後一條命令返回的退出狀態碼。
如果之前命令有失敗,但是最後一條命令是成功的,該函式的退出狀態碼也是0,所以使用預設退出狀態碼是很危險的。
2、使用return命令
return命令允許指定一個整數值來定義函式的退出狀態碼。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function db1 { read -p "enter your value:" value echo "doubling the value" return $[ $value * 2 ] } db1 echo "the new value is $?" [root@node1 ljy]# sh ceshi.sh enter your value:3 doubling the value the new value is 6
如果使用這種方式來獲取返回碼,需要注意
(1)函式一結束就取返回值。
(2)退出狀態碼必須是0~255
3、使用函式輸出
可以將函式的結果輸出儲存在變數中。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function db1 { read -p "enter your value:" value echo $[ $value * 2 ] } result=$(db1) echo "the new value is $result" [root@node1 ljy]# sh ceshi.sh enter your value:2 the new value is 4
在函式中使用變數
像函式傳遞引數
函式可以使用標準的引數環境變數來表示命令列上傳給函式的引數。
在指令碼中指定函式時,必須將函式和引數放在同一行:funcl $valu1 10
[root@node1 ljy]# more ceshi.sh #!/bin/bash function addem { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo "-1" elif [ $# -eq 1 ] then echo $[ $1 + $1 ] else echo $[ $1 + $2 ] fi } echo -n "adding 10 and 5: " value=$(addem 10 5) echo $value [root@node1 ljy]# sh ceshi.sh adding 10 and 5: 15
也可以這麼玩
[root@node1 ljy]# more ceshi.sh #!/bin/bash function addem { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo "-1" elif [ $# -eq 1 ] then echo $[ $1 + $1 ] else echo $[ $1 + $2 ] fi } echo -n "the result is: " value=$(addem $1 $2) echo $value [root@node1 ljy]# sh ceshi.sh 1 2 the result is: 3
在函式中處理變數
函式使用兩種型別的變數,全域性變數和區域性變數
1、全域性變數
預設情況下,你在指令碼中定義的任何變數都是全域性變數。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { temp=$[ $value + 5 ] value=$[ $temp + 1 ] } temp=2 value=3 func1 echo -n "temp is : " echo $temp echo -n "value is : " echo $value [root@node1 ljy]# sh ceshi.sh temp is : 8 value is : 9
temp的資料就受到了影響。
2、區域性變數
local 關鍵字保證了變數只侷限在該函式中。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { local temp=$[ $value + 5 ] value=$[ $temp + 1 ] } temp=2 value=3 func1 echo -n "temp is : " echo $temp echo -n "value is : " echo $value [root@node1 ljy]# sh ceshi.sh temp is : 2 value is : 9
函式遞迴
函式可以呼叫自己來得到結果。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { if [ $1 -eq 1 ] then echo 1 else local temp=$[ $1 - 1 ] local result=$(func1 $temp) echo $[ $result * $1 ] fi } read -p "enter value: " value result=$(func1 $value) echo "the factorial 0f $value is : $result" [root@node1 ljy]# sh ceshi.sh enter value: 5 the factorial 0f 5 is : 120
建立庫
bash shell允許建立函式庫檔案,然後在多個指令碼中引用該庫檔案。
1.建立一個包含指令碼中所需函式的公用庫檔案
2.在用到這些函式的指令碼檔案中包含庫檔名。
[root@node1 ljy]# more myfuncs function addem { echo $[ $1 + $2 ] } [root@node1 ljy]# more ceshi.sh #!/bin/bash . ./myfuncs result=$(addem 1 2) echo "result is $result" [root@node1 ljy]# sh ceshi.sh result is 3
使用函式庫的關鍵在於source命令。
source命令有個快捷的別名,叫做點操作符。
. ./name
在命令列上使用函式
在命令列上建立函式
有兩種方法:
一、採用單行方式定義函式
[root@node1 ljy]# function func1 { echo $[ $1 + $2 ]; } [root@node1 ljy]# func1 1 2 3
退出當前終端失效。
二、採用多行方式定義函式
[root@node1 ~]# function func1 { > echo $[ $1 + $2 ] > } [root@node1 ~]# func1 1 3 4
在函式的尾部使用花括號,shell就會知道你完成了函式的定義。
在.bashrc檔案中定義函式
為了防止每次退出shell後函式失效,可以將函式寫在.bashrc檔案。bash shell在每次啟動時都會在主目錄下查詢這個檔案。
1.直接定義函式
把你的函式直接寫在檔案末尾
[root@node1 ~]# more .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #a test function function func1 { echo $[ $1 + $2 ] } [root@node1 ~]# func1 2 3 5
2.讀取函式檔案
在shell指令碼中可以用source命令將庫檔案的函式新增到你的.bashrc檔案中
[root@node1 ~]# more .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #a test function . /ljy/myfuncs [root@node1 ~]# more /ljy/myfuncs function addem { echo $[ $1 + $2 ] } [root@node1 ~]# addem 1 3 4