簡單的Shell函數實例

1、Shell函數shell

本教程目前爲止全部腳本都是從頭至尾執行。這樣作很好,但你也許已經注意到有些腳本段間互相重複。數組

shell容許將一組命令集或語句造成一個可用塊,這些塊稱爲shell函數。bash

shell中函數的定義格式以下:
函數

複製代碼代碼以下:spa

函數名(){
    command1
    command2
    ...
    commandN
    [ return value ]
}命令行

若是願意,可在函數名前加上關鍵字function,這取決於使用者。
code


代碼以下:orm

function 函數名(){
    command1
    command2
    ...
    commandN
    [ return value ]
}教程

函數返回值,能夠顯示增長return語句;若是不加,則將最後一條命令運行結果做爲返回值(通常爲0,若是執行失敗則返回錯誤代碼)。 return後跟數值(0-255)。遞歸

函數能夠放在同一個文件中做爲一段代碼,也能夠放在只包含函數的單獨文件中。函數沒必要包含不少語句或命令,甚至能夠只包含一個echo語句,這取決於使用者。

下面的例子定義了一個函數並進行調用: 

複製代碼代碼以下:

#!/bin/bash
demoFun(){   
     echo "This is your first shell function!"
 }
echo "Function begin..."
demoFun
echo "Function end!"

輸出:
Function begin...
This is your first shell function!
Function end!

下面定義一個帶有return語句的函數: 

複製代碼代碼以下:

#!/bin/bash
funWithReturn(){
    echo "The function is to get the sum of two numbers..."
    echo -n "Input first number: "
    read aNum
    echo -n "Input another number: "
    read anotherNum
    echo "The two numbers are $aNum and $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "The sum of two numbers is $? !"

輸出相似下面:
The function is to get the sum of two numbers...
Input first number: 25
Input another number: 50
The two numbers are 25 and 50 !
The sum of two numbers is 75 !

函數返回值在調用該函數後經過 $? 來得到。

注意:全部函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,纔可使用。調用函數僅使用其函數名便可。

2、Shell函數參數

在Shell中,調用函數時能夠向其傳遞參數。在函數體內部,經過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...

帶參數的函數示例:

複製代碼代碼以下:

#!/bin/bash
funWithParam(){
    echo "The value of the first parameter is $1 !"
    echo "The value of the second parameter is $2 !"
    echo "The value of the tenth parameter is $10 !"
    echo "The value of the tenth parameter is ${10} !"
    echo "The value of the eleventh parameter is ${11} !"
    echo "The amount of the parameters is $# !"
    echo "The string of the parameters is $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

輸出:
The value of the first parameter is 1 !
The value of the second parameter is 2 !
The value of the tenth parameter is 10 !
The value of the tenth parameter is 34 !
The value of the eleventh parameter is 73 !
The amount of the parameters is 12 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !"

注意,$10 不能獲取第十個參數,獲取第十個參數須要${10}。當n>=10時,須要使用${n}來獲取參數

使用return命令

複製代碼

#!/bin/bash
# testing the script
function myfun {
  read -p "Enter a value:" value
  echo "double the value"
  return $[ $value * 2 ]
}

myfun

echo "The new vlue is $?"

複製代碼

結果:
Enter a value:23
double the value
The new vlue is 46
(退出狀態的取值範圍是0到255,$?是最近已執行命令的退出狀態)

使用函數輸出,這種方法最靠譜了
看例子

複製代碼

#!/bin/bash
# testing the script
function myfun {
  read -p "Enter a value:" value
  echo $[ $value * 2 ]
}

result=`myfun`

echo "The new vlue is $result"

複製代碼

(這樣就能很好的利用輸出結果了)

在函數中使用變量
向函數傳遞參數

複製代碼

#!/bin/bash
# testing the script
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 15:"value=`addem 10 15`
echo $value
echo -n "Just one number 10:"value=`addem 10`
echo $value
echo -n "No numbers:"value=`addem`
echo $value
echo -n "More than two numbers:"vaule=`addem 10 15 20`
echo $value

複製代碼

結果:
Adding 10 and 15:25
Just one number 10:20
No numbers:-1
(由上述可知,#能夠獲得參數的個數,1表示第一個參數,$2表示第二個參數)

複製代碼

#!/bin/bash
# testing the script
function addem {  if [ $# -eq 0 ]||[ $# -gt 2 ]
  then
    echo -1
  elif [ $# -eq 1 ]
  then
    echo $[ $1 + $1 ]  else
    echo $[ $1 + $2 ]
  fi
}if [ $# -eq 2 ]
then
  value=`addem $1 $2`
  echo "The value is $value"else
  echo "Usage:test1 a b"fi

複製代碼

(函數外面的#表示調用腳本使用的參數數,函數裏的#表示調用函數使用的參數數,注意這點區別)

做用域是變量的可見區域。
全局變量,在shell腳本內到處有效的變量。函數中定義全局變量,那麼主代碼中有效。主代碼中定義全局,函數中也有效。
默認狀況下,腳本中定義的變量都是全局變量。
看例子:

複製代碼

#!/bin/bash
# testing the script
function myfun {
  value=$[ $value * 2 ]
}
read -p "Enter a value:" value
myfun
echo "The new value is:$value"

複製代碼

(輸入45,獲得90,這裏的value在函數中發生變化了,到腳本中同樣可使用,並且已經變化了)

局部變量
做用範圍只在函數當中
關鍵字local

複製代碼

#!/bin/bash
# testing the script
function myfun {
  local value=$[ $value * 2 ]
}
read -p "Enter a value:" value
myfun
echo "The new value is:$value"

複製代碼

(輸入45,輸出45。由於加上local關鍵字以後,函數中的value是局部變量,與外界無關)

複製代碼

#!/bin/bash
# testing the script
function myfun {
  local value=$[ $value * 2 ]
  echo $value
}
read -p "Enter a value:" value
result=`myfun`
echo "The new value is:$value"echo "The result of the fun is $result"

複製代碼

(不過能夠經過輸出來獲取函數處理的結果,這裏的result仍是處理後的結果,好比輸入45,處理後是90)

數組變量與函數

複製代碼

#!/bin/bash
# testing the script
function addarray {
  local sum=0
  local newarray
  newarray=(`echo "$@"`)  for value in ${newarray[*]}  do
    sum=$[ $sum + $value ]
  done
  echo $sum
}
myarray=(1 2 3 4 5)
echo "The original array is :${myarray[*]}"arg=`echo ${myarray[*]}`
result=`addarray $arg`
echo "The result is $result"

複製代碼

結果:
The original array is :1 2 3 4 5
The result is 15
(數組參數傳入函數,函數獲取後,進行處理輸出。腳本將輸出結果打印)

複製代碼

#!/bin/bash
# testing the script
function addarray {
  local sum=0
  local newarray
  newarray=(`echo "$@"`)  for value in ${newarray[*]}  do
    sum=$[ $sum + $value ]
  done
  echo ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is :${myarray[*]}"arg=`echo ${myarray[*]}`
result=`addarray $arg`
echo "The result is $result"

複製代碼

(輸出數組)

函數遞歸

複製代碼

#!/bin/bash
# testing the script
function factorial {  if [ $1 -eq 1 ]
  then
    echo 1
  else
    local temp=$[ $1 -1 ]
    local result=`factorial $temp`
    echo $[ $result * $1 ]
  fi
}

read -p "Enter value:" value
result=`factorial $value`
echo "The factorial of $value is:$result"

複製代碼

(輸入5,輸出120。大環套小環,小環套更小,逐步執行。
咱們一步一步剖析
5輸入獲得5*4!
4又獲得4*3!
3又獲得3*2!
2又獲得2*1
由此獲得5*4*3*2*1也就是120


顯然單個腳本有助於減小輸入量,可是若是多個腳本碰巧使用一樣的函數又該怎樣?
建立庫

複製代碼

#my script functions
function addem {
  echo $[ $1 + $2 ]
}

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

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

複製代碼

使用函數庫的關鍵詞是source

#!/bin/bash
# testing the script
source ./myfuncs

result=`addem 10 15`
echo "The result is $result"

(經過source就能使用庫函數了)

#!/bin/bash
# testing the script
. ./myfuncs

result=`addem 10 15`
echo "The result is $result"
(或者點操做符,效果是同樣的)

在命令行中使用函數
[root@localhost shellscript]# function multem {
> echo [1 * $2 ]> }[root@localhost shellscript]# multem 2 510

相關文章
相關標籤/搜索