一、函数的两种定义方式

  第一种:函数名(){ ...... }

  第二种:function 函数名{ ...... }

  调用时直接使用 函数名 调用,将函数当作一个“命令”即可。函数内部直接使用 $1、$2 ... $n

二、函数返回值有两种形式

  • return
  • echo

1、使用 return 返回值

  • 利用 return 返回函数的返回值,取值范围为 1~255 的整数
  • 函数使用 return 返回值,通过只是用来供其他地方调用获取状态,因此一般情况只会返回 0 或 1。0表示成功,1表示失败

  例如:判断 nginx 进程是否启动:

#!/bin/bash
# 判断nginx是否启动

function is_run_nginx
{
        status=$$
        ps -ef | grep ngnix | grep -v grep | grep -v $status &> /dev/null
        if [ $? -eq 0 ]; then
                # 默认为0
                return
        else
                return 1
        fi
}
# return返回值不能 赋值给某个变量,只能用作后续程序进行判断
# is_run=`is_run_nginx` is_run_nginx
&& echo "nginx is running" || echo "nginx is stop"

 2、使用 echo 返回值

  • 使用 echo 可以返回任何字符串结果
  • 通常用来返回数据,比如一个字符串值 或 列表值

  举例:获取系统用户名

#!/bin/bash

#使用echo 返回值,返回系统用户名

function get_users
{
        # -d 指定分隔符,-f 指定取第几列
        echo `cat /etc/passwd | cut -d : -f 1`
}

user_list=`get_users`

index=1
for u in $user_list
do
        echo "This is $index user: $u"
done

 

三、Shell 全局变量与局部变量

1、全局变量

  • 不做特殊声明的话,默认都是全局变量
  • Tips:大型脚本慎用全局变量

2、局部变量(只能声明在函数内)

  • 定义变量时,使用 local 关键字
  • 函数内外同时存在同名变量,函数内变量覆盖函数外变量

注意:如果函数没有调用,函数里面的变量是不会生效的。

#!/bin.bash

var1="hello var1"

function test
{
        var2="hello var2"
        local var3="hello var3"
}

# test 没调用,var2,var3都不存在
echo $var1
echo $var2
echo $var3

test

echo $var1
echo $var2
# var3 为局部变量,不能打印
echo $var3

打印结果:

hello var1
           // test函数没调用,var2 不存在
       // test函数没调用,var2 不存在
hello var1 hello var2
// var3 是局部变量,echo 一个空值

 

四、建立函数库

 函数库存在的目的就是 将重复代码封装成函数文件。一般函数库不直接执行,而是供脚本进行调用

关于函数库的一些经验:

  • 库文件名的后缀是任意的,一般建议使用 .lib
  • 库文件一般没有可执行选项
  • 库文件无需和脚本在同一级目录,只需在脚本中引用时指定
  • 第一行一般使用 #!/bin/echo , 输出警告信息,避免用户执行。

举个例子:

  定义一个函数库,该函数库实现一下几个函数:1、加法函数 add;2、减法函数 reduce;3、乘法函数 multiple;4、除法函数 devide;打印系统运行情况的函数 sys_load,该函数可以显示内存运行情况。

  函数库如下:

function add
{
        echo "`expr $1 + $2`"
}

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

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

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

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

        echo "Disk Usage"
        echo
        df -h
        echo
} 

  引用函数库中的函数,当前 脚本 和 lib 在同一级目录。 

#!/bin/bash

# 引用函数库 lib/base_function
# 通过点 ". " 引入函数库 . lib
/base_function.lib add 10 10 reduce 20 10 multiple 30 10 divide 40 10 sys_load