Shell函數

1.函數定義

Shell函數有3中定義方式:

第一種定義:

function func(){
	do something...
}

第二種定義,函數名與“{”之間必須有空格

function func {
	do something...
}

第三種定義:

func(){
	do something...
}

Shell函數有點兒類似於C語言的函數,由於Shell函數沒有函數聲明,所以函數定義必須放在函數使用之前。同時,函數名必須是唯一的,否則會有問題,如果你重新定義了函數,那麼新定義的函數會覆蓋原函數,而不會產生錯誤信息。代碼如下:

#!/usr/bin/env bash

function func1(){
    name=func1
    echo "This is function $name"
}
func1

# 函數名與“{”之間必須有空格
function func2 {
    name=func2
    echo "This is function $name"
}
func2

func3(){
    name=func3
    echo "This is function $name"
}
func3

輸出:

This is function func1
This is function func2
This is function func3

2.返回值

2.1默認退出狀態碼

默認情況下,函數的退出狀態碼是函數中最後一條命令返回的退出狀態碼。在函數執行結束後,你可以用標準的“$?”變量來讀取退出狀態碼。這種默認情況有個弊端,就是退出狀態碼只能顯示函數中最後一條命令的執行狀態,而無法保證函數中其他命令的執行狀態。
下面的例子中,改變函數中命令的順序,得到不同的退出狀態碼:
function func(){
	ls -l test
	echo "test return status code"
}
func
echo "return status code: $?"

function func(){
	echo "test return status code"
	ls -l test
}
func
echo "return status code: $?"

2.2使用return命令指定退出狀態碼

在Shell腳本中,return命令不是返回函數的值,而是返回退出狀態碼。在使用return返回退出狀態碼時,需要注意:
  • 函數一結束就取退出狀態碼。如果在函數執行結束後,執行了其他命令,那麼退出狀態碼可能會丟失。
  • 退出狀態碼必須在0~255之間。

function func(){
	read -p "Enter a value: " value
	return $[ $value * 2 ]
}
func
echo "return status code: $?"

2.3函數返回值

如果要得到函數字符串、浮點數、整型等類型的返回值,那麼首先需要用echo命令輸出,然後將輸出保存到變量裏。獲取返回值有兩種方式:一是,將函數看作命令,用反引號“`”括起函數名;二是,用“$(函數名)”的形式。
function func(){
    name=func1
    echo "This is function $name"
}

val1=`func`
echo "The return value: $val1"

val2=$(func)
echo "The return value: $val2"

3.在函數使用變量

3.1向函數傳遞參數

函數可以使用標準的參數環境變量來代表命令行上傳給函數的參數。例如,函數名在$0中定義,函數命令行上的任何參數在$1、$2等定義,特殊變量$#代表傳給函數的參數數目。但是,函數的$#、$0、$1、$2等這些變量,和腳本主體參數的$#、$0、$1、$2等這些變量是完全不同的。注意,在腳本中給函數傳參時,函數名和參數必須在同一行。
function func(){
    arg1=$1
    val=4
    echo $[ $out * $arg1 * $2 ]
}

out=3
val1=`func $out 5`
echo "The return value: $val1"

val2=$(func $out 5)
echo "The return value: $val2"

3.2在函數中使用變量

在瞭解函數中使用變量之前,我們需要先知道全局變量和局部變量。
  • 全局變量:在Shell腳本的任何地方都有效的變量。默認情況下,在腳本中定義的任何變量都是全局變量。
  • 局部變量:函數內部使用的任何變量都可以被聲明爲局部變量。聲明局部變量時,在變量名前加上“local”關鍵字就行了;也可以在給變量賦值時,在變量名前加上“local”。
function func(){
    local arg
    arg=$1
    local temp=$[ $arg * 2 ]
    echo $temp
}

temp=3

val=`func 5`
echo "The global temp: $temp"
echo "The return value: $val"

4.數組變量和函數

如果對Shell數組不熟,可以先看Shell數組

4.1向函數傳遞數組參數

向腳本函數傳遞數組變量時,有些複雜。如果將數組變量當做單個參數傳遞的話,函數只會取數組變量的第一個值。要解決這個問題,你必須將該數組變量的值分解成單個值,然後將這些值作爲函數參數使用。在函數內部,你可以將所有的參數重組到新的數組變量中。
function func(){
    #local newarr=$1   只會得到數組的第一個元素
    local newarr=(`echo $@`)
    for i in ${!myarr[*]};do
        newarr[i]=$[ ${newarr[i]} * 2 ]
    done
    echo "The new array: ${newarr[*]}"
}
myarr=(1 2 3 4 5)

echo "My array: ${myarr[*]}"
func ${myarr[*]}

輸出:

My array: 1 2 3 4 5
The new array: 2 4 6 8 10

4.2從函數返回數組

從函數裏向Shell腳本傳回數組變量,也用類似接收數組參數的方法。函數用echo語句來按正確順序輸出單個數組值,然後腳本再將它們重新放進一個新的數組變量中。
function func(){
    local newarr=(`echo $@`)
    for i in ${!myarr[*]};do
        newarr[i]=$[ ${newarr[i]} * 2 ]
    done
    echo ${newarr[*]}
}

myarr=(1 2 3 4 5)

echo "My array: ${myarr[*]}"
val=(`func ${myarr[*]}`)
echo "The return array: ${val[*]}"
echo "The 5th element in the return array: ${val[4]}"

輸出:

My array: 1 2 3 4 5
The return array: 2 4 6 8 10
The 5th element in the return array: 10



發佈了101 篇原創文章 · 獲贊 122 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章