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

本文详细介绍了Shell脚本中的函数概念及其应用,包括函数定义、参数传递、返回值处理、变量作用域等内容,并通过多个实用示例展示了如何利用函数实现代码复用、模块化编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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

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

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

注意:

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

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


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

函数的作用

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

    模块化编程:

    结构化编程:


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

函数的特点

    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中生效 


本地变量:  

wKioL1m32kKR79rKAAAMtU_m0Wc850.png


局部变量:

wKiom1m32mqDRmJWAAANzfg8ah8932.png


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

函数递归

函数直接或间接调用自已

wKioL1m32przposqAAAYLCi1wP4366.png    

函数

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

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










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值