• shell 函数的高级用法


    函数介绍

    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,输出警告信息,避免用户执行

      

  • 相关阅读:
    【计蒜客】贝壳找房户外拓展(中等)扫描线+线段树
    【CodeForces】925 C.Big Secret 异或
    【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法
    【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
    【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
    【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
    【计蒜客】百度科学家(困难)
    【BZOJ】2115: [Wc2011] Xor
    【GDOI2018】所有题目和解题报告
    【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
  • 原文地址:https://www.cnblogs.com/crazymagic/p/11071874.html
Copyright © 2020-2023  润新知