1. 程式人生 > >Shell指令碼程式設計之函式

Shell指令碼程式設計之函式

2016/06/10


1. 指令碼中使用函式
建立函式的格式,有兩種:
function name {
commands
}

name() {
commands
}

#!/bin/bash
#using a function in a script

function func1 {
  echo "This is an example of a function"
}

count=1
while [ $count -le 5 ]
do 
func1
count=$[ $count +1 ]
done 

echo "This is the end of the loop"
func1

echo "Now this is the end of the script"




2. 函式返回值
使用函式輸出
#!/bin/bash

function func2 {
  echo "inside function"

  read -p "Enter a value: " value
  echo $[$value*2]
}

result=`func2`

echo "The new value is $result"




3.在函式中使用變數
3.1 向函式傳遞引數
函式可以使用標準的引數環境變數來代表命令列上傳給函式的引數,如,函式名會在$0變數中定義,函式命令列的任何引數都會通過$1, $2等定義。也可以用特殊變數$#來判斷傳給函式的引數數目 ,函式可以用引數環境變數獲得引數值。

3.1.1 在指令碼中呼叫函式時傳遞引數,必須將引數和函式放在同一行

#!/bin/bash

function add {
  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 15: "
value=`add 10 15`
echo $value

echo -n "Let's try adding just one number: "
value=`add 10`
echo $value

echo -n "Now trying adding no numbers: "

value=`add`
echo $value

echo -n "Finally,try adding three numbers: "
value=`add 10 15 20`
echo $value




3.1.2 在命令列中傳遞引數給指令碼中的函式
#!/bin/bash

function func3 {
  echo $[ $1+$2 ]
}

if [ $# -eq 2 ]
then 
  value=`func3 $1 $2`
  echo "The result is $value"
else
  echo "Usage: test2 a b"
fi





3.2 在函式中處理變數

函式會用兩種型別的變數:
A 全域性變數
B 區域性變數

3.2.1 全域性變數
預設情況下,你在指令碼中定義的任何變數都是全域性變數,在函式外定義的變數可在函式內正常訪問
3.2.2 區域性變數
不用在函式中使用全域性變數,函式內部使用的任何變數都可以被宣告成區域性變數。要那麼做時,只要在變數宣告的前面加上local關鍵字就可以了,也可以在給變數賦值時在賦值語句中使用local關鍵字,local關鍵字保證了變數只侷限在該函式中,如果指令碼中在該函式之外有同樣的名字的變數,那麼shell將會保證這兩個變數的值是分離的。

#!/bin/bash

function func4 {
  local temp=$[ $value+5 ]
  result=$[ $temp * 2 ]
}

temp=4
value=6

func4
echo "The result is $value"
if [ $temp -gt $value ]
then
  echo "temp is larger"
else
 echo "temp is smaller"
fi






4. 建立庫
很容易發現,在單個指令碼中,使用函式可以省去一些鍵入的工作,但如果你碰巧要在指令碼之間使用同一個程式碼塊呢?顯然,在每個指令碼中都定義一個同樣的函式會比較麻煩。有個方法能解決這個問題,bash shell允許建立函式庫檔案,然後在需要時在多個檔案中引用該庫檔案。這個過程的第一步時建立一個包含指令碼中所需函式的共用庫檔案,如:
/home/zh/work_space/scripts/function/myfuncs
function add {
 echo $[ $1+$2 ]
}

function mult {
  echo $[ $1 * $2 ]
}

function div {
  if [ $2 -ne 0 ]
  then 
    echo $[ $1 /$2 ]
  else
    echo -1
  fi
}


使用函式庫到關鍵在於source 命令,source命令會在當前的shell上下文中執行命令,而不是建立一個新的shell來執行命令。可以用source命令
來在shell指令碼中執行庫檔案指令碼,這樣函式就對指令碼可用了。source命令有個快捷別名,稱作點操作符(dot operator) ,要在shell 指令碼中執行myfuncs庫檔案,你只需要新增下面這行:
. ./myfuncs

#!/bin/bash
. ./myfuncs

value1=50
value2=10

result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`

echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"







5. 在.bashrc檔案中定義函式
bash shell會在每次啟動時在主目錄查詢這個檔案,不管是互動式的還是從現有shell中啟動一個新的shell
5.1 直接定義函式


5.2 讀取庫檔案指令碼
/home/zh/work_space/scripts/function/myfuncs
function add {
 echo $[ $1+$2 ]
}

function mult {
  echo $[ $1 * $2 ]
}

function div {
  if [ $2 -ne 0 ]
  then 
    echo $[ $1 /$2 ]
  else
    echo -1
  fi
}




看看效果:


更好的一點是,shell還會將定義好的函式傳給子shell程序,這樣這些函式會在該shell會話中的任何指令碼中也都可以用,如:
#!/bin/bash

value1=50
value2=10

result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`

echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"



結束!