05-Shell 编程之函数

1 Shell 函数

shell一个非常重要的特性是它可作为一种编程语言来使用。因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。

针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。

函数的作用就是把程序里多次调用相同代码的部分定义成一份,然后起个名字,所有的调用都 只用这名字就可以了,修改代码时,只需要改变函数体内的代码即可。

1.1、函数的优势

🐟 把相同的程序段定义成函数,可以减少代码量。
🐟 增加程序的可读、易读性
🐟 实现程序功能的模块化

1.2、定义函数

1
2
3
4
5
6
7
8
function clsn(){
echo "http://blog.znix.top"
}


znix(){
echo "http://www.znix.top "
}

说明:

  1. 可以带 function clsn() 定义,也可以直接 clsn() 定义,不带任何参数。

  2. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值n(0-255)

  3. 执行函数就是将函数名放到定义的函数之后即可

将函数加载到当前窗口执行:

1
2
3
4
5
6
7
[lepeng@centos ~]# . fun1.sh
[lepeng@centos ~]# zn
znew znix
[lepeng@centos ~]# znix
test
[lepeng@centos ~]# clsn
http://blog.znix.top

1.3、引用函数

脚本内容

1
2
3
4
5
6
[lepeng@centos ~]# cat fun2.sh
#!/bin/bash
#
Fun_File=/server/scripts/function/fun1.sh
[ -f $Fun_File ] && . $Fun_File
clsn

脚本执行结果

1
2
[lepeng@centos ~]# sh fun2.sh
http://blog.znix.top

1.4、函数传参

脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[lepeng@centos ~]# cat fun3.sh 
#!/bin/bash
#
function clsn(){
echo "Hi "
}
CLSN(){
echo "Hello "
echo $0
echo $1
echo $2
}
clsn
CLSN xi xi

脚本执行结果

1
2
3
4
5
6
[lepeng@centos ~]# sh fun3.sh 
Hi
Hello
fun3.sh
xi
xi

1.5 $0 永远的脚本名称

1
2
3
4
5
6
7
8
9
function clsn(){
echo "http://blog.znix.top $1 $2"
echo $0
}

znix(){
echo "test"
}
clsn $1 $2

执行结果

1
2
3
[lepeng@centos ~]# sh  fun1.sh 
http://blog.znix.top
fun1.sh

1.6、函数中return的用法

脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[lepeng@centos ~]# cat  fun3.sh 
#!/bin/bash
#

function clsn(){
echo "Hi "
}
CLSN(){
echo "Hello "
echo $0
echo $1
echo $2
return 4
echo "xxixiixxiix"

}
clsn
CLSN xi xi
echo $?

脚本执行结果

1
2
3
4
5
6
7
[lepeng@centos ~]# sh fun3.sh
Hi
Hello
fun3.sh
xi
xi
4

return命令说明:

1
2
3
4
5
6
7
8
9
return: return [n]
从一个 shell 函数返回。

使一个函数或者被引用的脚本以指定的返回值 N 退出。
如果 N 被省略,则返回状态就是
函数或脚本中的最后一个执行的命令的状态。

退出状态:
返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。

1.7、自定义常用函数库

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
#!/bin/bash
#

# 脚本初始化
function scripts_init(){
prog=`basename $0 .sh` # basename 命令:取出文件名称
LockFile=/var/lock/subsys/${prog}.lock # 使用锁文件
LogFile=/var/log/${prog}.log # 脚本记录日志
PidFile=/var/run/${prog}.pid # 记录进程号,可以管理脚本

[ -f $LockFile ] && echo "There $LockFile is exist!!" && exit 1 ||touch $LockFile
[ ! -f $LogFile ] && touch $LogFile
[ -f $PidFile ] && echo "There $PidFile is exist!!" && exit 2|| echo $$ > $PidFile
}

# 记录日志
function writelog(){
Date=$(date "+%F_%T")
ShellName=`basename $0`
Info=$1
echo "$Date : ${ShellName} : ${Info}" >> ${LogFile}
}

# 脚本退出扫尾
function closeout(){
[ -f $LockFile ] && rm -f $LockFile
[ -f $PidFile ]&& rm -f $PidFile
}

# 判断输入是整数
function int_judge(){
fun_a=$1
expr $fun_a + 1 &>/dev/null
RETVAL=$?
return $RETVAL
}

# 判断输入非空
function input_judge(){
RETVAL=0
fun_a=$1
[ ${#fun_a} -eq 0 ]&& RETVAL=1
return $RETVAL
}

$$ 参数:取出脚本运行时的pid, 脚本运行的当前进程ID号

1
2
3
4
5
6
[lepeng@centos ~]# echo $$
37208
[lepeng@centos ~]# ps -ef |grep 37208
root 37208 37206 0 08:39 pts/0 00:00:00 -bash
root 38578 37208 1 10:33 pts/0 00:00:00 ps -ef
root 38579 37208 0 10:33 pts/0 00:00:00 grep --color=auto 37208

引用自定义函数库示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[lepeng@centos ~]# head -22  fun3.sh 
#!/bin/bash
#
. /server/scripts/userfun.sh

scripts_init
i=1
while ((i<=10))
do
uptime
((i++))
sleep 1
done
closeout

05-Shell 编程之函数
https://flepeng.github.io/021-Shell-05-Shell-编程之函数/
作者
Lepeng
发布于
2016年1月1日
许可协议