更新时间:2022-04-06 09:03:31
函数、函数名、函数定义、变量作用域、函数返回值、参数、递归
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数:一段具有特定功能的代码
函数名:为这段代码所取的名字,可以通过函数名完成特定功能
注意:
函数名出现的地方即为 函数对应的代码替换的地方
(变量名出现的地方即为 变量所对的值替换的地方)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的作用
代码重用:过程式编程中,代码重用的重要组件.
模块化编程:
结构化编程:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的特点
1)没有执行入口,只能被有执行入口的程序调用执行
2)函数有生命周期:被调用时创建。调用结束时,终止。
3)函数的返回状态码:函数终止前最后一个命令的返回值,或由return命令给定返回值而终止
1
2
3
|
return #
0 成功
1-255 失败
|
4)函数的执行上下文:函数名被调用时会引入的一个新环境
5)函数的执行上下文中定义的变量(局部变量),存活同期为函数的生命周期
函数没有执行入口
函数的生命周期在调用结束后终止
函数名被调用时,即会引入一个函数上下文
函数的局部变量的作用域:函数的生命周期
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数、变量命令法则:
1、见名知义: 驼峰法则: childrenName _: children_name
2、数字、字母、_、特殊字符,不能是数字开头
3、不能是关键字: if, else, then, while等
4、区分大小写
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的语法:
1
2
3
4
|
格式一: function f_name {
函数的执行上下文
}
|
1
2
3
4
|
格式二: f_name() {
函数体
}
|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数的返回值:
执行结果:
过程调用: 没有执行结果
函数调用: 有执行结果
执行状态结果:
return #: 由return命令的返回值
最后一个命令的返回值
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数可接受参数
传递参数给函数,调用函数时,在函数后面以空白分隔给定参数列表即可,例如testfunc arg1 arg2
在函数体当中,可使用$1, $2, $3,....$*, $@, $#
接受参数,一般进行以下判断: [ $# -lt 1 ]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数中变量作用域
局部变量:local var=value ,在函数体中定义,变量存活的时间为函数的生命周期, 函数被调用时,变量被创建;函数结束时,变量被自动销毁.
本地变量:整个script中生效
本地变量:
局部变量:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数递归
函数直接或间接调用自已
函数
示例一:用户不存在则添加
示例二: 添加user1-user10
示例三: 添加服务脚本
示例四: 打印九九乘法表
函数的返回值
示例一: 添加user1-user10
示例二:打印NN乘法表
函数作用域
本地变量
局部变量
函数递归
示例一:阶乘运算 $[$1*$(fact $[$-1])]
示例二:求n阶斐波那契数列 $[fab $[$1-1]*$(fab [$1-2])]
函数
1、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
示例一:用户不存在则添加 #!/bin/bash # function adduser {
if [ $# -lt 1 ]; then
return 2
# 2 : no arguments
fi for i in $*; do
if id $i &> /dev/ null ; then
echo "$i is exist"
else
useradd $i
retval=$?
[ $retval -eq 0 ] && echo "Add user $i finished."
fi
done } adduser $* |
2、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
示例二: 添加user1-user10 #!/bin/bash # function addusers {
for i in user1 user2 user3 user4 user5 user6 user7 user8 user9 user10; do
if id $i &> /dev/ null ; then
echo "$i is exist"
else
useradd $i
[ $? -eq 0 ] && echo "Add $i finished."
fi
done
} addusers |
3、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
|
示例三: 添加服务脚本 #!/bin/bash # # chkconfig: - 98 2 # description: lcc.org prog=$( basename $0)
lockfile= /var/lock/subsys/ $prog
start() { if [ -e $lockfile ]; then
echo "$prog is already running"
else
touch $lockfile
if [ $? - ne 0 ]; then
touch $lockfile && echo "start $prog finished"
else
echo "start $prog finished"
fi
fi
} stop() { if [ -e $lockfile ]; then
rm -rf $lockfile
echo "stop $prog ok"
else
echo "$prog is stopped yet"
fi
} status() { if [ -e $lockfile ]; then
echo "$prog is running..."
else
echo "$prog is stopped..."
fi
} usage() { echo "Usage: $prog {start|stop|restart|status}"
return 2
} if [ $ # -lt 1 ]; then
usage
exit 2
fi case $1 in
start) start
;;
stop) stop
;;
status) status
;;
restart) stop
start
;;
*) usage
;;
esac |
4、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
示例四: 打印九九乘法表 #!/bin/bash # function multi {
for i in { 1 .. 9 }; do
for j in $(seq $i); do
echo -e -n "${j}X${i}=$(($i*$j))\t" done
echo
done
} multi |
函数的返回值
1、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
示例一: 添加user1-user10 #!/bin/bash # function f2 {
if id user$i &> /dev/ null ; then
echo "user$i is exist"
return 2
else
useradd user$i
[ $? -eq 0 ] && echo "Add user$i finished."
return 0
fi
} function f1 {
for i in { 1 .. 10 }; do
f2
echo $?
done
} f1 |
2、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
示例二:打印NN乘法表 #!/bin/bash # function multi {
if [ $# -lt 1 ]; then
return 2
# 2 : no argument
fi
local i= 1
while [ $i -le $ 1 ]; do
local j= 1
while [ $j -le $i ]; do
echo -e -n "${j}X${i}=$[$i*$j]\t"
let j++
done
echo
let i++
done
} multi $ 1
|
函数作用域
1、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
本地变量 #!/bin/bash # declare -i i= 6
f1() { let i++
echo "function: $i"
} f1 echo "script: $i"
[root@localhost bin]# bash local.sh function : 7
script: 7
|
2、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
局部变量 #!/bin/bash # declare -i i= 6
f1() { local i= 9
let i++
echo "function: $i"
} f1 echo "script: $i"
[root@localhost bin]# bash local.sh function : 10
script: 6
|
函数递归
1、
1
2
3
4
5
6
7
8
9
10
11
12
13
|
示例一:阶乘运算 $[$1*$(fact $[$-1])] #!/bin/bash # fact() { if [ $1 - eq 0 -o $1 - eq 1 ]; then
echo "1"
else
echo $[$1*$(fact $[$1-1])]
fi
} fact $1 |
2、
1
2
3
4
5
6
7
8
9
10
11
12
13
|
示例二:求n阶斐波那契数列 $[fab $[$1-1]*$(fab [$1-2])] #! /bin/bash # fab() { if [ $1 - eq 1 ]; then
echo 1
elif [ $1 - eq 2 ]; then
echo 1
else
echo $[fab $[$1-1]*$(fab [$1-2])]
} fab 2
|