首页 > 技术文章 > shell 函数的高级用法

crazymagic 2019-06-23 09:37 原文

函数介绍

linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用

语法格式

 

如何调用函数

 

shell终端中定义函数

[root@master day3]# test()
> {
> echo "test function";
> }

  

 

 

练习;时刻监听 nginx的进程,失败重启

nginx_daemon.sh

#!/bin/bash
#
# 获取脚本子进程的pid,如果脚本名称中带nginx,也会当成nginx进程
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 5
else
    systemctl start nginx
    echo "Nginx is down,Start it..."
fi
done

 

启动脚本

sh nginx_daemon.sh

 

 

 

 一系统守护进程运行

nohup sh nginx_daemon.sh &

 

查看日志 

tail -f nohup.out

 

 向函数传递参数

 一些高级语言传递参数

 

 高级语言函数调用

 

 

 

 shell 中函数传参

shell 中函数调用

 

简单小示例

[root@master day3]# function greeeting
> {
> echo "hello $1"
> }

向函数传递参数: 函数传参和给脚本传参类似,都是使用$1 $2 $3 $4 $5 $6 $7这种方式

例子1:

需求描述:写一个脚本,该脚本可以实现计算器的功能,可以进行+-*/四种运算。

calucate.sh

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

  

 

函数的返回值

返回值的方式

 

使用 return 返回值

 

使用 echo 返回值  

 

案例1  判断nginx进程是否存在

函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败

nginx.sh

#!/bin/bash
#

this_pid=$$

function is_nginx_running
{
    ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null
    if [ $? -eq 0 ];then
        return 0
    else
        return 1
    fi
}

is_nginx_running && echo "nginx is running" || echo "nginx is stopped"

  

执行脚本  

sh nginx.sh

  

 

 查看脚本进程的执行过程

sh -x nginx.sh

  

 

 

 案例2  获取系统中的用户

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

get_sys_user.sh

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

  

 执行脚本

sh get_sys_user.sh 

 

shell函数中的局部变量和全局变量

 

全局变量

 

局部变量

var.sh

#!/bin/bash
#

var1="Hello world"

function test
{
    var2=87
}

echo $var1
echo $var2

  

 

调用test函数后,$var2就变成了全局变量

#!/bin/bash
#

var1="Hello world"

function test
{
    var2=87
}

echo $var1
echo $var2

test    # 调用test函数后,$var2就变成了全局变量

echo $var1
echo $var2

 

在函数中也可以调用全局变量

#!/bin/bash
#

var1="Hello world"

function test
{
    var2=87
}

echo $var1
echo $var2

test

echo $var1
echo $var2

function test1
{
    echo $var2
}

test1

  

 

如果函数中声明了局部变量,当函数执行完成后局部变量就会被销毁

#!/bin/bash
#

var1="Hello world"

function test
{
    local var2=87    # 局部变量,只在函数内部生效,生命周期只在函数内部
}

test

echo $var1
echo $var2

 

函数库

为什么要定义函数库

函数库示例:

定义一个函数库,该函数库实现以下几个函数:

  • 1.加法函数add add 12 89
  • 2.减法函数reduce reduce 90 30
  • 3.乘法函数multiple multiple 12 10
  • 4.除法函数divide divide 9 3
  • 5.打印系统运行情况的函数sys_load,该函数可以显示内存运行情况,磁盘使用情况

cat /lib/base_function

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/base_function 
sys_load

  

 

 calculate.sh

#!/bin/bash
#

# 引入库函数,写绝对路径避免出错
. /lib/base_function

add 12 23

reduce 90 30

multiple 12 12

divide 12 2

 

 

库函数经验之谈:

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

  

 

推荐阅读