shell編程之函數(shù)

1.函數(shù)的定義和語法

函數(shù)由兩部分組成:函數(shù)名和函數(shù)體

語法一:

f_name (){ 
 ...函數(shù)體... 
 } ?

語法二:

function f_name { 
 ...函數(shù)體... 
 } ?

語法三:

function f_name () { 
 ...函數(shù)體... 
 }?

2.函數(shù)調(diào)用

調(diào)用:函數(shù)只有被調(diào)用才會執(zhí)行
調(diào)用:給定函數(shù)名
函數(shù)名出現(xiàn)的地方,會被自動替換為函數(shù)代碼
函數(shù)的生命周期:被調(diào)用時創(chuàng)建,返回時終止

3.函數(shù)返回值

函數(shù)有兩種返回值:
函數(shù)的執(zhí)行結(jié)果返回值:
(1) 使用echo等命令進行輸出
(2) 函數(shù)體中調(diào)用命令的輸出結(jié)果
函數(shù)的退出狀態(tài)碼:
(1) 函數(shù)的返回值默認取決于函數(shù)中執(zhí)行的最后一條命令的退出狀態(tài)碼,返回0或非0(0-255)
(2) 自定義退出狀態(tài)碼,其格式為:
return 從函數(shù)中返回,用最后狀態(tài)命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤返回

函數(shù)需要返回任意值,需要用echo

return的返回值缺陷
可自定義函數(shù)返回值,使用return
return 返回值范圍0-255,只能返回數(shù)值,如果值大于255,返回值不正確。
而且無法返回浮點數(shù),字符串。

示例1:

#!/usr/bin/bash

fun2(){
read -p "enter num:" num
let $[2*$num]
}

fun2


shell> bash fun3.sh
enter num:2

示例1,函數(shù)執(zhí)行后沒有任何返回值

示例2:

#!/usr/bin/bash

fun2(){
read -p "enter num:" num
let $[2*$num]
}

fun2
echo "fun2 return value: $?"

[root@localhost shell]# bash fun3.sh
enter num:2
fun2 return value: 0

示例2,函數(shù)執(zhí)行后使用$?獲取返回值,默認取決于函數(shù)中執(zhí)行的最后一條命令的退出狀態(tài)碼,返回0或非0(0-255之間的數(shù)字)

示例3:

#!/usr/bin/bash

fun2(){
read -p "enter num:" num
return $[2*$num]              #return后面不能使用表達式,只是數(shù)值
}

fun2
echo "fun2 return value: $?"

[root@localhost shell]# bash fun3.sh
enter num:2
fun2 return value: 4
[root@localhost shell]# bash fun3.sh
enter num:200
fun2 return value: 144          #返回結(jié)果錯誤,因為return返回最大值255

示例3,說明使用return返回值最大為255,超過或返回值為字符串則結(jié)果錯誤

示例4:

#!/usr/bin/bash

fun2(){
read -p "enter num:" num
echo  $[2*$num]
}

fun2

result=`fun2`             #可以使用一個變量來接收一個函數(shù)的輸出

[root@localhost shell]# bash fun3.sh
enter num:200
400

示例4,使用 echo進行輸出,echo可以返回任意值。

4.函數(shù)傳參-位置參數(shù)

#!/usr/bin/bash

if [ $# -ne 3 ];then
        echo "usage: `basename $0` par1 par2 par3"
        exit
fi

fun4(){
        echo "$(($1 * $2 * $3))"
}

#result=`fun4 1 2 3`             #函數(shù)傳參
result=`fun4 $1 $2 $3`         #函數(shù)傳參,關(guān)聯(lián)腳本的位置傳參
echo "result is: $result"

[root@localhost shell]# bash fun4.sh 1 2 3
result is: 6

可以直接給函數(shù)傳參,也可以關(guān)聯(lián)腳本的位置傳參,上面的執(zhí)行已關(guān)聯(lián)腳本的位置傳參。

5.函數(shù)傳參-數(shù)組

#!/usr/bin/bash

num=(1 2 3 4 5)
#echo "${num[@]}"

arrary(){
        factorial=1
        for i in "$@"                #使用$@接收所有參數(shù)
        do
                factorial=$[factorial * $i]
        done
        echo "$factorial"
}

arrary ${num[*]}
[root@localhost shell]# bash fun5.sh
120

6.函數(shù)返回-輸出數(shù)組變量

示例1

#!/usr/bin/bash

num=(1 2 3)

array(){
        local newarray=(`echo $*`)
        local outarray=()
        local i
        for((i=0;i<$#;i++))
        do
                outarray[$i]=$(( ${newarray[$i]} * 5 ))
        done
        echo "${outarray[*]}"
}

result=`array ${num[*]}`
echo ${result[*]}
[root@localhost shell]# bash fun6.sh
5 10 15

示例2

#!/usr/bin/bash

num=(1 2 3)

array() {
        local i
        local outarray=()
#       for i in $*
        for i                 #這種模式代表傳遞所有參數(shù)
        do
                outarray[j++]=$[$i*5]
        done
        echo "${outarray[*]}"
}

result=`array ${num[*]}`           #使用反引號會在子shell中執(zhí)行
echo ${result[*]}

#函數(shù)接收位置參數(shù) $1 $2 $3 ... $n
#函數(shù)接收數(shù)組變量 $* 或 $@
#函數(shù)使用參數(shù)的個數(shù) $#
#函數(shù)將接收到的所有參數(shù) 賦值給新數(shù)組 newarray=($*)

[root@localhost shell]# bash fun7.sh
5 10 15

7.預(yù)定義變量說明

**預(yù)定義變量說明**
$0  腳本名
$*  所有的參數(shù)
$@  所有的參數(shù)
$#  參數(shù)的個數(shù)
$$  當前進程的PID
$!  上一個后臺進程的PID
$?  上一個命令的返回值0表示成功
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于函數(shù)的介紹和使用 1.什么是函數(shù)? 函數(shù)其實就是一錐命令的合集,用來完成特定功能的代碼塊, 你可以對它進行自定...
    你好樹洞先生閱讀 541評論 0 0
  • 第 2 章 SHELL 基礎(chǔ)知識2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本,現(xiàn)在我們來進一...
    LiWei_9e4b閱讀 1,644評論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,711評論 0 5
  • 流程控制 if 單條件 雙分支 多分支 case case支持glob風格的通配符: *: 任意長度任意字符?: ...
    毛利卷卷發(fā)閱讀 824評論 0 1
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,143評論 2 9

友情鏈接更多精彩內(nèi)容