linux环境下Shell脚本中定义函数

这篇具有很好参考价值的文章主要介绍了linux环境下Shell脚本中定义函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

说实话,这是我第一次用Shell来定义函数,之前也写了很多shell脚本,但是体量都不大,所以基本上是按照需求罗列了多个命令来实现的,这次也是一样,但是我发现重复的地方太多了,所以还是要拿出看见本事“抽象函数”来解放我懒惰的手指

具体需求

检测特定名称的进程是否存在,若不存在则重新启动这个进程

仿照着之前的类似的脚本我写出了以下函数 check_and_fix_process,仅有一个需要注意的点就是Shell函数不需要定义参数,如果用到参数直接是用 $1$2$3……依次来代替就可以了

#!/bin/bash

# 检查并修复进程的函数
function check_and_fix_process() {
        # $1 进程名
        # $2 进程ID列表文件名
        # $3 进程ID列表文件md5值

        datetime=$(date +%y%m%d%H%M%S)
        ps aux |grep "$1" |grep -v grep |awk '{print $15}' |awk -F '=' '{print $2}'|sort -n > ~/tmplist

        a=$(md5sum ~/tmplist |awk '{print $1}')
        b="$3"

        if [[ $a = $b ]]; then
                echo "check [$1 $2 $3] ok"
        else
                tmp=$(diff ~/"$2" ~/tmplist |grep ^\< |awk '{print $2}' > /tmp/tmplist)
                for i in `cat /tmp/tmplist`
                do
                        cd ~/test && grep "ID=$i" start.sh | xargs -I {} sh -c '{}'

                        echo "$datetime $i" >>~/fixtxt
                        python3 ~/send_msg.py -c "process:$i crashed; fixtime:$datetime"
                done
        fi
}

# check all process list
check_and_fix_process "AProcess" "aprocesslist" "a887eedb72472f2ad152e5e91a0727da"
check_and_fix_process "BProcess" "bprocesslist" "a887eedb72472f2ad152e5e91a0727db"

ChatGPT读代码

如果对于这段代码有不理解的地方,可以请ChatGPT来帮忙,以下内容是它的解释,不得不说真是太强大了!身为此段代码的实现者,我都描述不了这么详细


这段代码是一个 Bash 脚本,用于检查指定的进程是否正常运行,并在发现异常时进行修复操作。下面逐行解释代码:

  1. function check_and_fix_process() {: 定义了一个名为 check_and_fix_process 的 Bash 函数。

  2. # $1 进程名: 这是一个注释,表示函数的第一个参数是进程名。

  3. # $2 进程ID列表文件名: 这是一个注释,表示函数的第二个参数是进程ID列表文件的文件名。

  4. # $3 进程ID列表文件md5值: 这是一个注释,表示函数的第三个参数是进程ID列表文件的MD5值。

  5. datetime=$(date +%y%m%d%H%M%S): 获取当前日期和时间,并将其格式化为"YYMMDDHHMMSS"的形式,存储在变量 datetime 中。

  6. ps aux |grep "$1" |grep -v grep |awk '{print $15}' |awk -F '=' '{print $2}'|sort -n > ~/tmplist: 这一行通过一系列的管道命令来查找指定进程名 $1 的进程,提取其中的某个列(可能是进程ID),然后排序,将结果保存到文件 ~/tmplist 中。

  7. a=$(md5sum ~/tmplist |awk '{print $1}'): 计算文件 ~/tmplist 的 MD5 值,并将结果保存在变量 a 中。

  8. b="$3": 将第三个参数值(进程ID列表文件的MD5值)保存在变量 b 中。

  9. if [[ $a = $b ]]; then: 如果变量 a 的值等于变量 b 的值(即进程ID列表文件的MD5值相匹配),则执行下面的代码块。

  10. echo "check [$1 $2 $3] ok": 输出一条信息表示检查通过。

  11. else: 如果进程ID列表文件的MD5值不匹配,则执行下面的代码块。

  12. tmp=$(diff ~/"$2" ~/tmplist |grep ^\< |awk '{print $2}' > /tmp/tmplist): 比较进程ID列表文件(路径为 ~/"$2")和当前的进程ID列表文件 (~/tmplist),将不匹配的部分提取出来并保存在临时文件 /tmp/tmplist 中。

  13. for i in $(cat /tmp/tmplist): 循环遍历临时文件 /tmp/tmplist 中的每一行内容。

  14. do: 循环体开始。

  15. cd ~/test && grep "ID=$i" start.sh | xargs -I {} sh -c '{}': 这一行的作用是切换到目录 ~/test 并在 start.sh 文件中查找包含字符串 “ID=$i” 的行,然后执行找到的行(通常是一些命令)。

  16. echo "$datetime $i" >>~/fixtxt: 将当前日期时间和进程ID添加到文件 ~/fixtxt 中。

  17. python3 ~/send_msg.py -c "process:$i crashed; fixtime:$datetime": 调用 Python 脚本 send_msg.py 并传递一条消息,该消息包含进程ID以及修复操作的时间。

  18. done: 循环结束。

  19. fi: 条件分支结束。

  20. }: 函数定义结束。

  21. check_and_fix_process "AProcess" "aprocesslist" "a887eedb72472f2ad152e5e91a0727da": 调用 check_and_fix_process 函数,检查名为 “AProcess” 的进程是否正常运行,使用文件 “aprocesslist” 作为进程ID列表文件,并传递预期的MD5值。

  22. check_and_fix_process "BProcess" "bprocesslist" "a887eedb72472f2ad152e5e91a0727db": 同上,检查名为 “BProcess” 的进程是否正常运行,使用文件 “bprocesslist” 作为进程ID列表文件,并传递预期的MD5值。

总结

  • Shell脚本中的函数不需要定义参数,如果用到参数直接是用 $1$2$3……依次来代替就可以
  • Shell脚本函数中使用 $1 作为参数,并不会与内部命令的 $1 冲突,因为Shell在不同的上下文中,变量的作用域是不同的
==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

看我ge,看我nai,看我jiu,玩的开心吗?文章来源地址https://www.toymoban.com/news/detail-651800.html

到了这里,关于linux环境下Shell脚本中定义函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】Shell脚本之函数的操作+实战详解(建议收藏⭐)

    🍁 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 函数是一段可以重复利用有组织的代码;可以减少代码,提高代码利用率,使脚本结构更加清晰。 这样只是写

    2024年02月05日
    浏览(46)
  • Linux shell编程学习笔记24:函数定义和使用

    *20231113 补充了实例使用for循环来简化代码的内容 为了实现模块化设计和代码重用,很多编程语言支持函数或过程,Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处,也有自己独特之处。 其中: function是 Shell 中的,专门用来定义函数

    2024年02月05日
    浏览(60)
  • Linux shell VM虚拟机类型检查脚本函数(支持WSL、WSL2)

    对于,开源脚本这个函数的扩展修改,其它用户都可以将这段代码直接移植到自己的脚本程序之中,并且调用使用它。 如果期望管道捕获它输出的值,则这么调用即可:shell变量=$(virt_check)

    2024年03月12日
    浏览(69)
  • 【玩转Linux操作】详细讲解Shell的函数,exit,文件重定向,引入外部脚本的操作

    🎊专栏【​​​​​​​玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 bash 中的函数类似于C/C++中的函数,但是 return 的返回值与C/C++不同,返回的是 exit code ,取值为0~255,

    2024年02月12日
    浏览(38)
  • Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明

    Shell脚本是一种命令语言,可以用于自动化执行各种任务。在脚本中,我们可以通过参数来传递信息,这样脚本就可以根据这些信息来执行特定的操作。本文将介绍如何在shell脚本中传递参数,包括位置参数、特殊变量、环境变量和命名参数。 1.1 解释器 #!/bin/bash 称为shebang或

    2024年02月06日
    浏览(82)
  • 【Linux之Shell脚本实战】Linux创建新用户脚本

    1.要求用户输入用户名和密码,新建用户; 2.如果用户没有输入,则提醒退

    2023年04月17日
    浏览(38)
  • 【Linux】shell脚本和bat脚本:

    一、脚本对应环境: 【1】shell:linux环境;后缀名为.sh 主要用在linux中,而linux系统对应的shell又有很多,如Bourne Shell(/usr/bin/sh或/bin/sh),又如Bourne Again Shell(/bin/bash)由于Bourne Again Shell(/bin/bash)免费且易用,故使用较多。 对应的脚本文件后缀名为.sh。 注: #! 告诉系统其

    2024年02月09日
    浏览(38)
  • linux shell脚本详解

    算符 描述 示例 文件比较运算符 -e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ] -d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ] -f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ] -L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ] -r filename 如果 filena

    2024年02月05日
    浏览(49)
  • 【Linux】shell脚本教程

    目录 一、shell历史 二、执行脚本 三、基本语法 3.1变量 3.1.1变量的分类 3.1.2删除变量 3.2文件名代换(Globbing) 3.3命令代换 3.4算术代换 3.5转义字符 3.6单引号 3.7双引号 四、Shell脚本语法 4.1条件测试 4.2分支 4.2.1if/then/elif/else/fi 4.2.2case/esac 4.3循环 4.3.1for/do/done 4.3.2while/do/done 4.3.

    2024年02月08日
    浏览(48)
  • Linux Shell脚本入门

    目录 介绍 编写格式与执行方式 Shell脚本文件编写规范 脚本文件后缀名规范 首行格式规范 注释格式 shell脚本HelloWord入门案例 需求 效果 实现步骤 脚本文件的常用执行三种方式 介绍 3种方式的区别 小结 多命令处理 Shell变量 环境变量 目标 Shell变量的介绍 变量类型 系统环境变

    2024年01月19日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包