Shell 文法之函數

來源:互聯網
上載者:User

標籤:io   使用   ar   for   strong   檔案   資料   sp   div   

函數是被賦予名稱的指令碼代碼塊,可以在代碼的任意位置重用。每當需要在指令碼中使用這樣的代碼塊時,只需引用該代碼塊被賦予的函數名稱。

 

建立函數

格式

function name {

  commands

}

name 屬性定義了該函數的唯一名稱。name 後面要有空格。

 

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"

 

注意:如果在函數定義之前使用函數,會得到錯誤訊息。

         如果重新定義函數,那麼新定義將取代函數原先的定義。

 

函數傳回值

預設退出狀態

預設情況下,函數的退出狀態是函數的最後一條命令返回的退出狀態。

樣本

#!/bin/bash
# testing the exit status of a function

func1() {
echo "trying to display a non-existent file"
ls -l badfile
}

echo "testing the function:"
func1
echo "The exit status is: $?"

 

使用 return 命令

return  命令可以使用單個整數值來定義函數退出狀態,提供了一種通過編程設定函數退出狀態的簡單方法。

樣本

#!/bin/bash
# using the return command in a function

function db1 {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2]
}

db1
echo "The new value is $?"

注意:請記住在函數完成後儘快提取傳回值

         請記住退出狀態的取值範圍是0~255

 

使用函數輸出

正如命令輸出可以捕獲並存放到 shell 變數中一樣,函數的輸出也可以捕獲並存放到 shell 變數中。

樣本

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

function db1 {
read -p "Enter a value: " value
echo $[ ($value) * 2 ]
}

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

 

向函數傳遞參數

函數可以使用標準參數環境變數來表示命令列傳遞給函數的參數。

函數名在變數 $0 中定義, 函數命令列的其他參數使用變數 $1、$2...,專有變數$#可以用來確定傳遞給函數的參數數目。

樣本

#!/bin/bash
# passing parameters to a function

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 "Let‘s try adding just one number: "
value=`addem 10`
echo $value
echo -n "Now trying adding no numbers: "
value=`addem`
echo $value
echo -n "Finally, try adding three numbers: "
value=`addem 10 15 20`
echo $value

 

由於函數為自己的參數值使用專用的參數環境變數,所以函數無法從指令碼命令行直接存取指令碼參數值。如果想在函數中使用這些值,那麼必須在調用該函數時手動傳遞這些資料。

樣本

#!/bin/bash
# trying to access script parameters inside a function

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

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

 

在函數中使用變數

全域變數是在 shell 指令碼內處處有效變數。

樣本

#!/bin/bash
# using a global variable to pass a value

function db1 {
value=$[ $value * 2 ]
}

read -p "Enter a value: " value
db1
echo "The new value is: $value"

 

局部變數是在函數內部使用的變數,在變數聲明前面冠以 local 關鍵字。

如果指令碼在函數外部有同名變數,那麼 shell 將能區分開這兩個變數。

樣本

#!/bin/bash
# demonstrating the local keyword

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

temp=4
value=6

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

 

向函數傳遞數組

如果試圖將陣列變數作為函數參數使用,那麼函數只提取陣列變數的第一個取值。

樣本

#!/bin/sh
# array variable to function test

function testit {
local newarray
newarray=("[email protected]")
echo "The new array value is: ${newarray[*]}"
}

myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}

必須將陣列變數拆分為單個元素,然後使用這些元素的值作為函數參數。

 

函數內部使用數組

樣本

#!/bin/bash
# adding values in an array

function addarray {
local sum=0
local newarray
newarray=(`echo "[email protected]"`)
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo $sum
}

myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=`addarray $arg1`
echo "The result is $result"

 

從函數返回數組

樣本

#!/bin/sh
# returning an array value

function arraydblr {
local origarray
local newarray
local elements
local i
origarray=(`echo "[email protected]"`)
newarray=(`echo "[email protected]"`)
elements=$[ $# - 1 ]
for(( i=0; i<=elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}

myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=(`arraydblr $arg1`)
echo "The new array is: ${result[*]}"

 

函數遞迴

樣本

#!/bin/sh
# using recursion

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

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

 

建立庫

建立函數的庫檔案,可以在不同指令碼中引用該庫檔案。

其痛點在於 shell 函數的範圍。與環境變數一樣,shell 函數僅在其定義所處的 shell 會話中有效。如果從 shell 命令列介面運行庫檔案,那麼 shell 將開啟一個新的 shell ,並在新 shell 中運行此指令碼,但是當試圖運行調用這些庫函數的另一個指令碼時,庫函數並不能使用。

使用函數庫的關鍵是 source 命令。source 命令在當前 shell 環境中執行命令,而非建立新 shell 來執行命令。使用 source 命令在 shell 指令碼內部運行庫檔案指令碼。

source 有一個短小的別名,稱為點操作符(.)

樣本

#!/bin/bash
# using functions defiend in a library file

. ./myfuncs

value1=10
value2=5
result1=`addem $value1 $value2`
result2=`multem $value1 $value2`
result3=`divem $value1 $value2`

echo "The result of adding them is: $result1"
echo "The result of multiplying them is: $result2"
echo "The result of dividing them is: $result3"

 

在命令列中使用參數

$ function divem { echo $[ $1 + $2 ]; }

$ divem 100 5

 

在.bashrc 檔案中定義函數

將函數定義放在 shell 每次啟動都能重新載入的地方,.bashrc。

可以直接定義函數,或者提供函數檔案。

Shell 文法之函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.