函数、函数名、函数定义、变量作用域、函数返回值、参数、递归


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

函数:一段具有特定功能的代码

函数名:为这段代码所取的名字,可以通过函数名完成特定功能

注意:

    函数名出现的地方即为 函数对应的代码替换的地方

    (变量名出现的地方即为 变量所对的值替换的地方)


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

函数的作用

    代码重用:过程式编程中,代码重用的重要组件.

    模块化编程:

    结构化编程:


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

函数的特点

    1)没有执行入口,只能被有执行入口的程序调用执行

    2)函数有生命周期:被调用时创建。调用结束时,终止。

    3)函数的返回状态码:函数终止前最后一个命令的返回值,或由return命令给定返回值而终止

        return #
            0 成功
            1-255 失败


    4)函数的执行上下文:函数名被调用时会引入的一个新环境

    5)函数的执行上下文中定义的变量(局部变量),存活同期为函数的生命周期

    

函数没有执行入口 

函数的生命周期在调用结束后终止

函数名被调用时,即会引入一个函数上下文

函数的局部变量的作用域:函数的生命周期


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

函数、变量命令法则

    1、见名知义: 驼峰法则: childrenName _: children_name

    2、数字、字母、_、特殊字符,不能是数字开头

    3、不能是关键字: if, else, then, while等

    4、区分大小写


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

函数的语法:   

格式一:
    function f_name {
        函数的执行上下文
    }

格式二:
    f_name() {
        函数体
    }


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

函数的返回值

    执行结果:

        过程调用: 没有执行结果

        函数调用: 有执行结果

    

    执行状态结果:

        return #: 由return命令的返回值

        最后一个命令的返回值


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

函数可接受参数

    传递参数给函数,调用函数时,在函数后面以空白分隔给定参数列表即可,例如testfunc arg1 arg2

    在函数体当中,可使用$1, $2, $3,....$*, $@, $#

    

    接受参数,一般进行以下判断: [ $# -lt 1 ]


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

函数中变量作用域

    局部变量:local var=value ,在函数体中定义,变量存活的时间为函数的生命周期, 函数被调用时,变量被创建;函数结束时,变量被自动销毁.

    本地变量:整个script中生效 


本地变量:  

wKioL1m32kKR79rKAAAMtU_m0Wc850.png


局部变量:

wKiom1m32mqDRmJWAAANzfg8ah8932.png


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

函数递归

函数直接或间接调用自已

wKioL1m32przposqAAAYLCi1wP4366.png    

函数

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

示例二: 添加user1-user10

示例三: 添加服务脚本

示例四: 打印九九乘法表

函数的返回值 

示例一: 添加user1-user10

示例二:打印NN乘法表

函数作用域

本地变量

局部变量

函数递归

示例一:阶乘运算 $[$1*$(fact $[$-1])]

示例二:求n阶斐波那契数列  $[fab $[$1-1]*$(fab [$1-2])]



函数

1、

示例一:用户不存在则添加
#!/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、

示例二: 添加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、

示例三: 添加服务脚本
#!/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、

示例四: 打印九九乘法表
#!/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、

示例一: 添加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、

示例二:打印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、

本地变量
#!/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、

局部变量
#!/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*$(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、

示例二:求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