函数、函数名、函数定义、变量作用域、函数返回值、参数、递归
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数:一段具有特定功能的代码
函数名:为这段代码所取的名字,可以通过函数名完成特定功能
注意:
函数名出现的地方即为 函数对应的代码替换的地方
(变量名出现的地方即为 变量所对的值替换的地方)
函数的作用
代码重用:过程式编程中,代码重用的重要组件.
模块化编程:
结构化编程:
函数的特点
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,如需转载请自行联系原作者