shell script中建立函數

1.基本的腳本函數

1.1建立函數

建立函數有2中格式:shell

function name {
   command
}
name(){
  command
}
#name後的圓括號爲空

1.2使用函數

直接引用函數名,函數定義必須在引用以前。函數名必須惟一,不然函數會被新的建立的同名函數覆蓋掉,而不會報錯。數組

1.3函數返回值 

bash shell會把函數當作小型腳本,運行結束時會返回一個退出狀態碼。有3中不一樣的方法生成退出狀態碼。bash

1)默認退出狀態碼ide

默認退出狀態碼是函數中最後一條命令返回的退出狀態碼。能夠用$?來查看。函數

2)使用return命令spa

bash shell使用return命令來退出函數並返回特定的退出狀態碼。命令行

但注意:函數一結束就取返回值;退出狀態碼必須在0~255之間。code

3)使用函數輸出遞歸

能夠將函數輸出保存到shell變量中,result=`functionname`three

#!/bin/bash
#using the echo to return a value

function db1 {
  read -p "Enter a value: " value     #注意技巧
  echo $[ $value * 2 ]
}

rusult=`db1`
echo "The new value is $result"

函數用echo語句顯示計算結果。技巧:db1函數輸出了2條信息,read命令輸出了一條詢問用戶輸入值的消息。bash shell沒有將它做爲STDOUT輸出的一部分,而且忽略掉它。·

1.4函數中變量的用法

1)向函數傳遞參數

bash shell 會將函數當成小型腳本,意味着咱們能夠向函數傳遞參數,同腳本相似,函數也可使用標準的參數環境變量來表明命令行上傳給函數的參數。如$0表明函數名、$一、$2.等定義參數,$#表明參數數目。

在腳本中使用帶參函數時,函數和參數必須放在同一行,如:functionname  參數1  參數2...

注意:因爲函數使用特殊參數環境變量做爲本身的參數值,它不能直接從腳本的命令行獲取腳本的參數值。必須在調用函數時,手動將它們傳過去

#!/bin/bash
#trying to access script parameters inside a function 
function func1 {
  echo $ [ $1 * $2 ]
}
if [ $# -eq 2 ]
then 
 value=`func1 $1 $2`        #此處注意。將腳本的參數傳遞給函數。。若改成value=`func1`沒法執行成功   
 echo "The result is $value"
else
  echo "usage : sh1.sh a b"
fi

2)在函數中處理變量——全局和局部

全局變量

全局變量在shell腳本中任何地方都有效,默認狀況下,在腳本中定義的任何變量都是全局變量。函數可使用全局變量,若函數改變了變量的值,這個值是有效的,函數外這個變量就變成了新值。

#!/bin/bash
#test variables

function func1 {
  temp=$[ $value + 5 ]
  result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "the result is: $result"
echo "the temp is: $temp"
echo "the $value is: $value"

執行結果:
the result is: 22
the temp is: 11
the $value is: 6
#能夠看到temp被函數func1賦予新值

局部變量

函數內部使用的變量能夠聲明爲局部變量:local  變量

也能夠在給變量賦值時使用local關鍵字。local關鍵字保證變量只侷限在函數中。

#!/bin/bash
#test variables

function func1 {
  local temp=$[ $value + 5 ]
  result=$[ $temp * 2 ]
  echo 「the local temp is: $temp"
}
temp=4
value=6
func1
echo "the result is: $result"
echo "the temp is: $temp"
echo "the $value is: $value"

執行結果:
the local temp is: 11   #注意temp值,在函數內變化
the result is: 22
the temp is: 4     #注意temp值,在函數外沒有
the $value is: 6

2.數組變量和函數

2.1數組定義

與C語言中數組相似,數組是可以存儲多個值的變量,值可按單個值或整個數組來引用。值與值之間用空格分開。

數組定義:myarray=(one two three four five)   或者數字    myarrayn=(1 2 3 4 5 6 7)

echo  $myarry   只顯示第一個數one     echo ${myarry[2]} 顯示一個數  three                       echo ${myarry[*]}  顯示整個數組one two three four five

能夠用unset命令刪除數組中的某個值,注意:值刪掉了,但位置還在

$unset myarray[2]
$echo ${myarray[*]}
one two four five
$echo ${myarray[2]}

$echo ${myarray[3]}
four

2.2向函數傳遞數組

向函數傳遞數組時,必須使用functionname ${myarray[*]} 的方式傳遞,不能只寫數組名$myarray,不然只能傳遞第一個數。

在接收數組值以後,能夠在函數內重建數組,重建的數組任然能夠像其餘數組同樣使用。

#!/bin/bash
#array variable test
function testit {
  local newarray  
  newarray=($@)     #這幾種重建方式均可以newarray=(`echo "$@"`)   
  local sum=0
  for value in ${newarray[*]}
  do
    sum=$[ $sum + $value ]
  done
  echo $sum
}
wholearray=(1 2 3 4 5)
echo "the original array is :${wholearray[*]}"
result=`testit ${wholearray[*]}`     #注意傳遞數組的全部值
echo "the result is $result"

@lab403-1F:~/shell_script$ ./shell5.sh
the original array is :1 2 3 4 5
the result is 15

2.3從函數返回數組

就是在函數中構建數組,並從新返回給腳本。

#!/bin/bash
#array variable test
function testit {
  local newarray=$@     
#此處不加括號,運行是不會報錯,由於newarray[$i]=$[ ${origarray[$i]} * 2 ]一句生成新的數組
  local origarray=($@)    
#此處若省略括號origarray=$@,會把全部值賦給origarray[0],echo ${origarray[0]},會輸出1 2 3 4 5,   #而echo ${origarray[1]}沒有值輸出,運行時出錯!!!
  n=$[ $# - 1 ]
  for (( i=0; i <= $n; i++ ))
  {
    newarray[$i]=$[ ${origarray[$i]} * 2 ]
  }
  echo ${newarray[*]}
}
wholearray=(1 2 3 4 5)
echo "the original array is :${wholearray[*]}"
result=`testit ${wholearray[*]}`
echo "the result is ${result[*]}"

執行結果:
yanfang@lab403-1F:~/shell_script$ ./shell5.sh
the original array is :1 2 3 4 5
the result is 2 4 6 8 10

3.遞歸函數

遞歸函數能夠遞歸的調用本身,不須要使用任何外部資源。一般遞歸函數都有一個最終能夠迭代到的基準值。計算階乘的函數爲例:

function factorial {
  if [ $1 -eq 1 ]
  then
    echo 1
  else
    local temp=$[ $1 - 1 ]
    local result=`factorial temp`
    echo $[ $result * $1 ]
  fi
}

4.建立函數庫

能夠將多個腳本須要用函數寫在同一個文件中,並在腳本中引用,腳本中引用庫函數文件須要用source(.點操做符)命令。

注意:庫文件的路徑,若庫文件與腳本在同一目錄,能夠用source ./functions  或者         . ./fuanctions;  

 若庫文件與腳本不在同一目錄,則用絕對路徑: . /home/caishu/fuanctions

能夠把函數寫進 .bashrc文件(能夠是用戶的.bashrc,能夠是系統的),shell每次啓動都能從新載入的地方。

$ .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
#直接定義的函數
function addem {
  echo [[1 + $2 ]
}

#也能夠在這裏用source命令加函數庫
. /home/caishu/functions
(重啓shell以後,新加入的函數就有效了)
相關文章
相關標籤/搜索