且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

谢烟客---------Linux之脚本编程---函数

更新时间: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中生效 


本地变量:  

谢烟客---------Linux之脚本编程---函数


局部变量:

谢烟客---------Linux之脚本编程---函数


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

函数递归

函数直接或间接调用自已

谢烟客---------Linux之脚本编程---函数    

函数

示例一:用户不存在则添加

示例二: 添加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 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 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 in {1..9}; do
        for 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 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
function7
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
function10
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










本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1964474,如需转载请自行联系原作者