天天看點

謝煙客---------Linux之腳本程式設計---函數

函數、函數名、函數定義、變量作用域、函數傳回值、參數、遞歸

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

函數:一段具有特定功能的代碼

函數名:為這段代碼所取的名字,可以通過函數名完成特定功能

注意:

    函數名出現的地方即為 函數對應的代碼替換的地方

    (變量名出現的地方即為 變量所對的值替換的地方)

函數的作用

    代碼重用:過程式程式設計中,代碼重用的重要元件.

    子產品化程式設計:

    結構化程式設計:

函數的特點

    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 &amp;&gt; /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>] &amp;&amp; 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 &amp;&gt; /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>] &amp;&amp; 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 &amp;&amp; </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 &amp;&gt; /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>] &amp;&amp; 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,如需轉載請自行聯系原作者

繼續閱讀