shell 函式定義
函式的定義和基本知識
向函式傳遞引數
函式返回值
函式呼叫:指令碼放置多個函式;函式相互調用;一個函式呼叫多個函式
區域性變數和全域性變數
函式遞迴:使用區域性變數的遞迴;不使用區域性變數的遞迴
函式的定義和基本知識
函式是一串命令的集合,函式可以把大的命令集合分解成若干較小的任務。程式設計人員可以基於函式進一步的構造更復雜的Shell 程式,而不需要重複編寫相同的程式碼。下面給出了Linux Shell中函式的基本形式
function_name()
{
command1
command2
…
commandN
}
對函式結構進行解釋:
其中標題:函式名,函式體:函式內的命令集合,在編寫指令碼時要注意標題名應該唯一,如果不唯一,指令碼執行時會產生錯誤。
在函式名前可以加上關鍵字function,但加上和省略關鍵字function對指令碼的最終執行不產生任何影響。
函式體中的命令集合必須含有至少一條命令,即函式不允許空命令,這一點和C語言不同。
函式之間可透過引數、函式返回值互動,函式在指令碼中出現的次序可以是任意的,但是必須按照指令碼中的呼叫次序執行這些函式。
向函式傳遞引數
在bash Shell程式設計中,向函式傳遞的引數仍然是以位置引數的方式來傳遞的,而不能傳遞陣列等其它形式變數,這與C語言或Java語言中的函式傳遞是不同的。
#function4.sh
#!/bin/bash
half()
{
let "n = $1"
let "n = n/2"
echo "In function half() n is $n"
}
let "m = $1"
echo "Before the function half() is called, m is $m"
half $m
echo "After the function half() is called, m is $m"
在Linux Shell程式設計中,函式還可傳遞間接引數,但該方式傳遞方式遠遠沒有C語言和Java語言靈活,而只能使用第9章所述的間接變數引用來傳遞引數,這種方式是一種笨拙的間接引數傳遞方式。其中表示式expr1為迴圈變數賦初值的語句
#function6.sh
#!/bin/bash
ind_func()
{
echo " $1"
}
parameter=ind_arg
ind_arg=Hello
ind_func "$parameter"
ind_func "${!parameter}"
echo "***********************"
ind_arg=World
ind_func "$parameter"
ind_func "${!parameter}"
函式返回值
有時需要指令碼執行完成後返回特定的值來完成指令碼的後繼操作,這些特定的值就是函式返回值。在Linux Shell程式設計中,函式透過return返回其退出狀態,0表示無錯誤,1表示有錯誤。在指令碼中可以有選擇的使用return語句,因為函式在執行完最後一條語句後將執行呼叫該函式的地方執行後繼操作。
#function7.sh
#!/bin/bash
show_week()
{
echo -n "What you input is: "
echo "$1"
case $1 in
0)
echo "Today is Sunday. "
return 0;;
1)
echo "Today is Monday. "
return 0;;
2)
echo "Today is Tuesday. "
return 0;;
3)
echo "Today is Wednesday. "
return 0;;
4)
echo "Today is Thursday. "
return 0;;
5)
echo "Today is Friday. "
return 0;;
6)
echo "Today is Saturday. "
return 0;;
*)
return 1;;
esac
}
if show_week "$1"
then
echo "What you input is right! "
else
echo "What you input is wrong! "
fi
exit 0
指令碼放置多個函式
可以在指令碼中放置多個函式,指令碼執行時按照呼叫函式的順序執行這些函式.
#function9.sh
#!/bin/bash
show_week()
{
for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday
do
echo -n "$day "
done
echo ""
}
show_number()
{
for(( integer = 1; integer <= 7; integer++ ))
do
echo -n "$integer "
done
echo ""
}
show_square()
{
i=0
until [[ "$i" -gt 7 ]]
do
let "square=i*i"
echo "$i * $i = $square"
let "i++"
done
}
show_week
show_number
show_square
函式相互呼叫
在Linux Shell程式設計中,函式之間可以相互呼叫,呼叫時會停止當前執行的函式轉去執行被呼叫的函式,直到呼叫的函式執行完,再返回當前函式繼續執行。
一個函式呼叫多個函式
在Linux Shell程式設計中允許一個函式呼叫多個函式,在該函式呼叫其他函式時同樣需要按照呼叫的順序來執行呼叫的函式。
區域性變數和全域性變數
在Linux Shell程式設計中,可以透過local關鍵字在Shell函式中宣告區域性變數,區域性變數將侷限在函式範圍內。此外,函式也可呼叫函式外的全域性變數,如果一個區域性變數和一個全域性變數名字相同,則在函式中區域性變數將會覆蓋掉全域性變數
函式遞迴
Linux Shell中可以遞迴呼叫函式,即函式可以直接或間接呼叫其自身。在遞迴呼叫中,主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。例13-12是一個遞迴呼叫的例子。
#例13-12:function12.sh演示了一個函式遞迴呼叫
#!/bin/bash
#遞迴呼叫函式
foo()
{
read y
foo $y
echo "$y"
}
#呼叫函式
foo
exit 0
使用區域性變數進行遞迴一般是針對數值執行來使用的。階乘運算是一個使用區域性變數的遞迴呼叫過程,實現了n! 的運算,其可以透過下面的公式表示:
n!=1 (n=0)
n!=n*(n-1)! (n>=1)
按照該公式可實現對階乘的運算,由於該階乘運算中存在終止條件“0!=1”,所以可以使用函式遞迴來實現該運算。
#function13.sh
#!/bin/bash
fact ()
{
local num=$1
if [ "$num" -eq 0 ]
then
factorial=1
else
let "decnum=num-1"
fact $decnum
let "factorial=$num * $?"
fi
return $factorial
}
fact $1
echo "Factorial of $1 is $?"
exit 0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-1408008/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Shell中函式的定義和使用函式
- shell自定義函式函式
- shell-定義一個顏色輸出字串函式字串函式
- 如何在 Linux Shell 程式設計中定義和使用函式Linux程式設計函式
- 02_函式定義及使用函式函式
- 如何在函式內部定義函式?函式
- python---函式定義Python函式
- python如何定義函式Python函式
- 兄弟連go教程(11)函式 - 函式定義Go函式
- 什麼是Python函式?如何定義函式?Python函式
- qt之函式重定義QT函式
- ts函式約束定義函式
- 在jQuery定義自己函式jQuery函式
- shell函式函式
- 函式引數 引數定義函式型別函式型別
- 第 8 節:函式-函式定義和引數函式
- makefile--函式定義與呼叫函式
- Python如何定義一個函式Python函式
- Python巢狀定義函式增強reduce()函式功能Python巢狀函式
- 方法(函式)的定義與引數函式
- Python騷操作:動態定義函式Python函式
- TS定義陣列 ts宣告函式陣列函式
- 模型的列表定義中,使用函式時如何定義引數?模型函式
- Shell 函式的使用函式
- [譯]Kotlin中是應該定義函式還是定義屬性?Kotlin函式
- c語言函式指標的定義C語言函式指標
- 函式基本定義和使用‘未完待續函式
- C++入門教程(12):定義函式C++函式
- vue 在methods中定義的函式 not definedVue函式
- "undefined reference to strptime"之自己定義strptime函式Undefined函式
- TypeScript 定義函式的幾種寫法TypeScript函式
- shell高階-----建立函式函式
- 建構函式定義的隱式型別轉換函式型別
- shell 中怎麼定義常量
- 關於變數的宣告和定義、內部函式和外部函式變數函式
- 定義函式的兩種形式及區別函式
- python學習總結之 函式定義defPython函式
- vue 全域性函式的 定義與任意呼叫Vue函式
- PHP 到底該怎麼定義全域性函式?PHP函式