函數(shù)
1、語法
函數(shù)定義語法如下:
[ function ] funname [()] {
action;
[return int;]
}
說明 :
函數(shù)定義時(shí),
function關(guān)鍵字可有可無。函數(shù)返回值 - return 返回函數(shù)返回值,返回值類型只能為整數(shù)(0-255),如果函數(shù)的返回值超過255,超出時(shí)值將為除以256取余。如果不加 return 語句,shell 默認(rèn)將以最后一條命令的運(yùn)行結(jié)果,作為函數(shù)返回值。
函數(shù)返回值在調(diào)用該函數(shù)后通過
$?來獲得。-
所有函數(shù)在使用前必須定義。這意味著必須將函數(shù)放在腳本開始部分,直至 shell 解釋器首次發(fā)現(xiàn)它時(shí),才可以使用。調(diào)用函數(shù)僅使用其函數(shù)名即可。
#!/usr/bin/env bash f1 f1(){ echo "f11" } # 這樣子 就會(huì)報(bào)錯(cuò)
注意:當(dāng)一個(gè)shell腳本里面定義了兩個(gè)相同名的函數(shù),最終的結(jié)果只會(huì)顯示最后一個(gè)。
2、無參數(shù)
示例:
無返回值
#!/usr/bin/env bash
# function 可省略
function calc(){
echo " Hello World"
}
calc
echo "the result is: $?" # $? 獲取 calc 函數(shù)返回值
# 返回結(jié)果:
#Hello World
#the result is: 0
有返回值
#!/usr/bin/env bash
test(){
read -p " 請輸入一個(gè)數(shù)字: " num
return $[$num*2]
}
test
echo "this function test return value is " $?
# 返回結(jié)果:
# 請輸入一個(gè)數(shù)字: 10
# this function test return value is 20
# 返回結(jié)果:
# 請輸入一個(gè)數(shù)字: 1000
# this function test return value is 208
3、函數(shù)傳參
在Shell中,調(diào)用函數(shù)時(shí)可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過 $n的形式來獲取參數(shù)的值,例如,$1表示第一個(gè)參數(shù),$2表示第二個(gè)參數(shù)…即使用位置參數(shù)來實(shí)現(xiàn)參數(shù)傳遞。
#!/usr/bin/env bash
add(){
let sum=$1+$2
return $sum
}
add $1 $2
echo "this function add return value is " $?
# 返回結(jié)果
# ./add.sh 1 3
# this function add return value is 4
4、函數(shù)變量的作用范圍
函數(shù)在shell腳本中僅在當(dāng)前shell環(huán)境中有效
Shell腳本中變量默認(rèn)全局有效
-
將變量限定在函數(shù)內(nèi)部使用local命令
- 函數(shù)內(nèi)部變量通過local來實(shí)現(xiàn)
- 通過定義myfun函數(shù),在其內(nèi)部設(shè)置局部變量i
- 函數(shù)內(nèi)部和外部分別賦值,進(jìn)行結(jié)果驗(yàn)證。
ps:
**全局變量代表整體可以使用**
**局部變量代表的是全局變量里面可以使用其中一部分**
示例
#!/usr/bin/env bash
test(){
local i
i=6
echo $i
}
i=8
test
echo " i value is " $i
# 返回結(jié)果:
# 6
# i value is 8
如果把 local 去除掉,則返回的結(jié)果如下所示:
#6
#i value is 6
5、位置參數(shù)
位置參數(shù)是在調(diào)用一個(gè)函數(shù)并傳給它參數(shù)時(shí)創(chuàng)建的變量。
位置參數(shù)變量表:
| 變量 | 描述 |
|---|---|
$0 |
腳本名稱 |
$1...$9
|
第1個(gè)參數(shù)到地9個(gè)參數(shù)列表 |
${10}...${n}
|
第 10 個(gè)到 N 個(gè)參數(shù)列表 |
$* or $@
|
除了$0 外的所有位置參數(shù) |
$# |
不包括$0在內(nèi)的位置參數(shù)的個(gè)數(shù) |
$FUNCNAME |
函數(shù)名稱(僅在函數(shù)內(nèi)部有值) |
示例
#!/usr/bin/env bash
test(){
let sum=$1+$2
echo "腳本名稱" $0
echo "函數(shù)名稱" $FUNCNAME
echo "除了$0外的所有位置參數(shù)" $@
echo "除了$0外的所有位置參數(shù)" $*
echo "不包括$0在內(nèi)的位置參數(shù)的個(gè)數(shù)" $#
return $num
}
test $1 $2
echo "sum value is " $?
# 輸出結(jié)果
# 腳本名稱 ./func.sh
# 函數(shù)名稱 test
# 除了./func.sh外的所有位置參數(shù) 1 3
# 除了./func.sh外的所有位置參數(shù) 1 3
# 不包括./func.sh在內(nèi)的位置參數(shù)的個(gè)數(shù) 2
# sum value is 0
6、函數(shù)處理參數(shù)
特殊字符用來處理參數(shù)
| 變量 | 描述 |
|---|---|
$# |
返回參數(shù)個(gè)數(shù) |
$* |
返回所有參數(shù) |
? |
腳本運(yùn)行的當(dāng)前進(jìn)程 ID 號(hào) |
$! |
后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的 ID 號(hào) |
$@ |
返回所有參數(shù) |
$- |
返回 Shell 使用的當(dāng)前選項(xiàng),與 set 命令功能相同。 |
$? |
函數(shù)返回值 |
示例
#!/usr/bin/env bash
test(){
echo "腳本運(yùn)行的當(dāng)前進(jìn)程 ID 號(hào):" ?
echo "后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的 ID 號(hào):" $!
echo "Shell 使用的當(dāng)前選項(xiàng):$-"
}
test
# 輸出結(jié)果
# 腳本運(yùn)行的當(dāng)前進(jìn)程 ID 號(hào): 7
# 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的 ID 號(hào):
# Shell 使用的當(dāng)前選項(xiàng):hB