函数的高级用法

一、函数的定义和使用

1、语法格式

格式一
格式二

2、如何调用函数

  • 直接使用函数名调用,可以将其想象成Shell的一条命令
  • 函数内部可以使用参数 $1、$2、$3......$n
  • 调用函数: function_name $1 $2

3、示例演示

  • 创建函数
1
2
3
4
Test()
{
echo "Hello Test"
}
  • 使用函数
1
Test

4、小脚本(nginx守护进程)

写一个nginx脚本,如果nginx服务宕掉,则该服务可以检测并且将进程重新启动;如果正常运行,则不作任何处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#

this_pid=$$

while true
do
ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null

if [ $? -eq 0 ];then
echo "Nginx is running well"
sleep 3
else
systemctl start nginx
echo "Nginx is down,Start it...."
fi
done

二、向函数传递参数

1、Shell中传参

2、Shell中函数调用

3、小脚本

写一个脚本,该脚本可以实现计算器的功能,可以进行 +、-、*、/四种运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#

function calcu
{
case $2 in
+)
echo "`expr $1 + $3`"
;;
-)
echo "`expr $1 - $3`"
;;
\*)
echo "`expr $1 \* $3`"
;;
/)
echo "`expr $1 / $3`"
;;
esac
}

calcu $1 $2 $3

三、函数的返回值

1、return

  • 使用return返回值,只能返回1-255的整数
  • 函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常返回0或1

2、echo

  • 返回任何字符串结果
  • 通常适用于返回数据,比如一个字符串或者列表值

3、小练习

获取系统中所有的用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#

function get_users
{
users=`cat /etc/passwd | cut -d: -f1`
echo $users
}

user_list=`get_users`

index=1
for u in $user_list
do
echo "The $index user is : $u"
index=$(($index+1))
done

四、局部变量和全局变量

  • 不作任何声明,Shell中的变量都是全局变量
  • 大型脚本程序中应当慎用全局变量

1、局部变量的定义

定义变量时,使用 local关键字

函数内和外若存在同名变量,则函数内部变量会覆盖外部变量

2、小脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#

var1="Hello world"

function test
{
local var2=87
}

test

echo $var1
echo $var2

五、函数库

  • 经常使用的重复代码封装成函数文件
  • 一般不是直接执行的,而是由其他脚本调用

1、小脚本

  • 函数库脚本
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
function add
{
echo "`expr $1 + $2`"
}

function reduce
{
echo "`expr $1 - $2`"
}

function multiple
{
echo "`expr $1 \* $2`"
}

function divide
{
echo "`expr $1 / $2`"
}

# x
function sys_load
{
echo "Memory Info"
echo
free -m
echo

echo "Disk Usage"
echo
df -h
echo
}
  • 调用函数脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#

# 引入库文件
. /root/lesson/3.5/lib/base_function

add 12 23

reduce 90 30

multiple 12 12

divide 12 2