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