有兩種格式能夠用來在bash shell腳本中建立函數。
第一種採用關鍵字function。後跟分配給該代碼的函數名。node
function name { commands }
name屬性定義了賦予函數惟一的名稱。腳本中定義的每一個函數都必須有一個惟一的名稱。
commands是構成函數的一條或多條bash shell命令。在調用該函數時,bash shell會按命令在函數中出現的順序依次執行,就像在普通腳本中同樣。shell
在bash shell腳本中定義函數的第二種格式更接近於其餘編程語言中定義函數的方式。編程
name(){ conmmands }
函數名後的空括號代表正在定義的是一個函數。這種格式的命名規則和以前定義shell腳本函數的格式同樣。bash
要在腳本中使用函數,只須要向其餘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種不一樣的方法來爲函數生成退出狀態碼。函數
默認狀況下,函數的退出狀態碼是函數中最後一條命令返回的退出狀態碼。命令行
若是以前命令有失敗,可是最後一條命令是成功的,該函數的退出狀態碼也是0,因此使用默認退出狀態碼是很危險的。blog
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
若是使用這種方式來獲取返回碼,須要注意ci
(1)函數一結束就取返回值。
(2)退出狀態碼必須是0~255
能夠將函數的結果輸出保存在變量中。
[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
函數使用兩種類型的變量,全局變量和局部變量
一、全局變量
默認狀況下,你在腳本中定義的任何變量都是全局變量。
[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的數據就受到了影響。
二、局部變量
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
有兩種方法:
1、採用單行方式定義函數
[root@node1 ljy]# function func1 { echo $[ $1 + $2 ]; } [root@node1 ljy]# func1 1 2 3
退出當前終端失效。
2、採用多行方式定義函數
[root@node1 ~]# function func1 { > echo $[ $1 + $2 ] > } [root@node1 ~]# func1 1 3 4
在函數的尾部使用花括號,shell就會知道你完成了函數的定義。
爲了防止每次退出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