天天看点

谢烟客---------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,如需转载请自行联系原作者

继续阅读