• 使用grep -c参数出现的种种谜团


    起因

    一学员咨询脚本问题:
    在这里插入图片描述
    这个脚本中出现了grep -c 参数

    我们都知道-c表示统计符合条件的行数,看逻辑没有问题,但实际运行会有一些出入。

    源文件:

    #!/bin/bash
    # 用于判断某个进程是否存在
    #NAME=/usr/sbin/sshd    #NAME:进程的唯一判断标识
    NAME=$1
    NUM=$(ps -ef|grep $NAME | grep -vc grep)
    echo $NUM
    if [ $NUM -eq 1 ];then
            echo -e "\033[32m$NAME is running.\033[0m"
    elif [ $NUM -gt 1 ];then
            echo -e "\033[31m存在重复的${NAME}进程,请检查!\033[0m"
    else
            echo -e "\033[33m$NAME is not running.\033[0m"
    fi
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    执行结果
    在这里插入图片描述

    但你把命令单独拿出来又是另外一个结果:

    [root@laoxin-06 ~]# ps -ef|grep sshd | grep -vc grep
    1
    
    • 1
    • 2

    问题原因

    grep -c 参数统计的是符合条件的行不假,但他会把后面执行的命令一并算进去。

    如果你的脚本名字是test.sh, 你需要在后面执行./test.sh sshd 所以把这个也提前给他去掉

    当然这里的脚本名字可以用 $0替代

    解决方案一:

    把num的变量里加上去掉脚本本身
    NUM=$(ps -ef|grep $NAME | grep -vc grep|grep -v test.sh)

    但这种方式并不严谨,因为你的脚本名字不能一直叫test.sh, 所以这里可以改成 $0

    NUM=$(ps -ef|grep $NAME | grep -vc grep|grep -v $0)

    解决方案二:

    不适用grep -c参数,而是用wc -l替代

    wc -l 查询的是当下时刻

    NUM=ps -ef|grep $NAME | grep -vc grep |wc -l

    这种形式等同于:

    NUM=$(ps -ef|grep $NAME | grep -vc grep |wc -l)

    总结

    很多时候我翻译过来的命令解释在实际使用中会有出入,这时候就需要我们去反复测试,除了用替代方案之外,也要找到问题的原因。

  • 相关阅读:
    自定义Docker镜像--Jupyterlab
    深入实现 MyBatis 底层机制的任务阶段3 - 封装 SqlSession 到执行器
    IO流再回顾,深入理解序列化和反序列化
    Vue指令
    .NET应用系统的国际化-整体设计思路
    Vue:自定义实现日历表
    HTML5 Web 存储:简化数据存储的利器
    学习C++第二课
    Sublime上插件的安装与使用
    qt中QFileSystemModel和QStringListModel使用
  • 原文地址:https://blog.csdn.net/xinshuzhan/article/details/126327973