函數、函數名、函數定義、變量作用域、函數傳回值、參數、遞歸
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函數:一段具有特定功能的代碼
函數名:為這段代碼所取的名字,可以通過函數名完成特定功能
注意:
函數名出現的地方即為 函數對應的代碼替換的地方
(變量名出現的地方即為 變量所對的值替換的地方)
函數的作用
代碼重用:過程式程式設計中,代碼重用的重要元件.
子產品化程式設計:
結構化程式設計:
函數的特點
1)沒有執行入口,隻能被有執行入口的程式調用執行
2)函數有生命周期:被調用時建立。調用結束時,終止。
3)函數的傳回狀态碼:函數終止前最後一個指令的傳回值,或由return指令給定傳回值而終止
1
2
3
<code> </code><code>return</code> <code>#</code>
<code> </code><code>0 成功</code>
<code> </code><code>1-255 失敗</code>
4)函數的執行上下文:函數名被調用時會引入的一個新環境
5)函數的執行上下文中定義的變量(局部變量),存活同期為函數的生命周期
函數沒有執行入口
函數的生命周期在調用結束後終止
函數名被調用時,即會引入一個函數上下文
函數的局部變量的作用域:函數的生命周期
函數、變量指令法則:
1、見名知義: 駝峰法則: childrenName _: children_name
2、數字、字母、_、特殊字元,不能是數字開頭
3、不能是關鍵字: if, else, then, while等
4、區分大小寫
函數的文法:
4
<code>格式一:</code>
<code> </code><code>function</code> <code>f_name {</code>
<code> </code><code>函數的執行上下文</code>
<code> </code><code>}</code>
<code>格式二:</code>
<code> </code><code>f_name() {</code>
<code> </code><code>函數體</code>
函數的傳回值:
執行結果:
過程調用: 沒有執行結果
函數調用: 有執行結果
執行狀态結果:
return #: 由return指令的傳回值
最後一個指令的傳回值
函數可接受參數
傳遞參數給函數,調用函數時,在函數後面以空白分隔給定參數清單即可,例如testfunc arg1 arg2
在函數體當中,可使用$1, $2, $3,....$*, $@, $#
接受參數,一般進行以下判斷: [ $# -lt 1 ]
函數中變量作用域
局部變量:local var=value ,在函數體中定義,變量存活的時間為函數的生命周期, 函數被調用時,變量被建立;函數結束時,變量被自動銷毀.
本地變量:整個script中生效
本地變量:
<a href="https://s5.51cto.com/wyfs02/M02/A5/1C/wKioL1m32kKR79rKAAAMtU_m0Wc850.png" target="_blank"></a>
局部變量:
<a href="https://s5.51cto.com/wyfs02/M01/06/6B/wKiom1m32mqDRmJWAAANzfg8ah8932.png" target="_blank"></a>
函數遞歸
函數直接或間接調用自已
函數
示例一:使用者不存在則添加
示例二: 添加user1-user10
示例三: 添加服務腳本
示例四: 列印九九乘法表
函數的傳回值
示例一: 添加user1-user10
示例二:列印NN乘法表
函數作用域
本地變量
局部變量
示例一:階乘運算 $[$1*$(fact $[$-1])]
示例二:求n階斐波那契數列 $[fab $[$1-1]*$(fab [$1-2])]
1、
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>示例一:使用者不存在則添加</code>
<code>#!/bin/bash</code>
<code>#</code>
<code>function</code> <code>adduser {</code>
<code>if</code> <code>[ $# -lt </code><code>1</code> <code>]; then</code>
<code> </code><code>return</code> <code>2</code>
<code> </code><code># </code><code>2</code><code>: no arguments</code>
<code>fi</code>
<code>for</code> <code>i </code><code>in</code> <code>$*; </code><code>do</code>
<code> </code><code>if</code> <code>id $i &> /dev/</code><code>null</code><code>; then</code>
<code> </code><code>echo </code><code>"$i is exist"</code>
<code> </code><code>else</code>
<code> </code><code>useradd $i</code>
<code> </code><code>retval=$?</code>
<code> </code><code>[ $retval -eq </code><code>0</code> <code>] && echo </code><code>"Add user $i finished."</code>
<code> </code><code>fi</code>
<code>done</code>
<code>}</code>
<code>adduser $*</code>
2、
<code>示例二: 添加user1-user10</code>
<code>function</code> <code>addusers {</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>user1 user2 user3 user4 user5 user6 user7 user8 user9 user10; </code><code>do</code>
<code> </code><code>if</code> <code>id $i &> /dev/</code><code>null</code><code>; then</code>
<code> </code><code>echo </code><code>"$i is exist"</code>
<code> </code><code>else</code>
<code> </code><code>useradd $i</code>
<code> </code><code>[ $? -eq </code><code>0</code> <code>] && echo </code><code>"Add $i finished."</code>
<code> </code><code>fi</code>
<code> </code><code>done</code>
<code>addusers</code>
3、
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<code>示例三: 添加服務腳本</code>
<code># chkconfig: - 98 2</code>
<code># description: lcc.org</code>
<code>prog=$(</code><code>basename</code> <code>$0)</code>
<code>lockfile=</code><code>/var/lock/subsys/</code><code>$prog</code>
<code>start() {</code>
<code> </code><code>if</code> <code>[ -e $lockfile ]; </code><code>then</code>
<code> </code><code>echo</code> <code>"$prog is already running"</code>
<code> </code><code>touch</code> <code>$lockfile</code>
<code> </code><code>if</code> <code>[ $? -</code><code>ne</code> <code>0 ]; </code><code>then</code>
<code> </code><code>touch</code> <code>$lockfile && </code><code>echo</code> <code>"start $prog finished"</code>
<code> </code><code>echo</code> <code>"start $prog finished"</code>
<code>stop() {</code>
<code> </code><code>rm</code> <code>-rf $lockfile</code>
<code> </code><code>echo</code> <code>"stop $prog ok"</code>
<code> </code><code>echo</code> <code>"$prog is stopped yet"</code>
<code>status() {</code>
<code> </code><code>echo</code> <code>"$prog is running..."</code>
<code> </code><code>echo</code> <code>"$prog is stopped..."</code>
<code>usage() {</code>
<code> </code><code>echo</code> <code>"Usage: $prog {start|stop|restart|status}"</code>
<code>if</code> <code>[ $</code><code># -lt 1 ]; then</code>
<code> </code><code>usage</code>
<code> </code><code>exit</code> <code>2</code>
<code>case</code> <code>$1 </code><code>in</code>
<code>start)</code>
<code> </code><code>start</code>
<code> </code><code>;;</code>
<code>stop)</code>
<code> </code><code>stop</code>
<code>status)</code>
<code> </code><code>status</code>
<code>restart)</code>
<code>*)</code>
<code>esac</code>
4、
<code>示例四: 列印九九乘法表</code>
<code>function</code> <code>multi {</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>{</code><code>1</code><code>..</code><code>9</code><code>}; </code><code>do</code>
<code> </code><code>for</code> <code>j </code><code>in</code> <code>$(seq $i); </code><code>do</code>
<code> </code><code>echo -e -n </code><code>"${j}X${i}=$(($i*$j))\t"</code>
<code> </code><code>done</code>
<code> </code><code>echo</code>
<code>multi</code>
<code>示例一: 添加user1-user10</code>
<code>function</code> <code>f2 {</code>
<code> </code><code>if</code> <code>id user$i &> /dev/</code><code>null</code><code>; then</code>
<code> </code><code>echo </code><code>"user$i is exist"</code>
<code> </code><code>return</code> <code>2</code>
<code> </code><code>useradd user$i</code>
<code> </code><code>[ $? -eq </code><code>0</code> <code>] && echo </code><code>"Add user$i finished."</code>
<code> </code><code>return</code> <code>0</code>
<code>function</code> <code>f1 {</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>{</code><code>1</code><code>..</code><code>10</code><code>}; </code><code>do</code>
<code> </code><code>f2</code>
<code> </code><code>echo $?</code>
<code>f1</code>
<code>示例二:列印NN乘法表</code>
<code> </code><code>if</code> <code>[ $# -lt </code><code>1</code> <code>]; then</code>
<code> </code><code>return</code> <code>2</code>
<code> </code><code># </code><code>2</code><code>: no argument</code>
<code> </code><code>local i=</code><code>1</code>
<code> </code><code>while</code> <code>[ $i -le $</code><code>1</code> <code>]; </code><code>do</code>
<code> </code><code>local j=</code><code>1</code>
<code> </code><code>while</code> <code>[ $j -le $i ]; </code><code>do</code>
<code> </code><code>echo -e -n </code><code>"${j}X${i}=$[$i*$j]\t"</code>
<code> </code><code>let j++</code>
<code> </code><code>let i++</code>
<code>} </code>
<code>multi $</code><code>1</code>
<code>本地變量</code>
<code>declare -i i=</code><code>6</code>
<code>f1() {</code>
<code> </code><code>let i++</code>
<code> </code><code>echo </code><code>"function: $i"</code>
<code>echo </code><code>"script: $i"</code>
<code>[root@localhost bin]# bash local.sh</code>
<code>function</code><code>: </code><code>7</code>
<code>script: </code><code>7</code>
<code>局部變量</code>
<code> </code><code>local i=</code><code>9</code>
<code>function</code><code>: </code><code>10</code>
<code>script: </code><code>6</code>
<code>示例一:階乘運算 $[$1*$(fact $[$-1])]</code>
<code>fact() {</code>
<code> </code><code>if</code> <code>[ $1 -</code><code>eq</code> <code>0 -o $1 -</code><code>eq</code> <code>1 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>"1"</code>
<code> </code><code>echo</code> <code>$[$1*$(fact $[$1-1])]</code>
<code>fact $1</code>
<code>示例二:求n階斐波那契數列 $[fab $[$1-1]*$(fab [$1-2])]</code>
<code>#! /bin/bash</code>
<code>fab() {</code>
<code> </code><code>if</code> <code>[ $1 -</code><code>eq</code> <code>1 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>1</code>
<code> </code><code>elif</code> <code>[ $1 -</code><code>eq</code> <code>2 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>$[fab $[$1-1]*$(fab [$1-2])]</code>
<code>fab 2</code>
<code></code>
本文轉自 lccnx 51CTO部落格,原文連結:http://blog.51cto.com/sonlich/1964474,如需轉載請自行聯系原作者