基本腳本函數
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