使用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)
总结
很多时候我翻译过来的命令解释在实际使用中会有出入,这时候就需要我们去反复测试,除了用替代方案之外,也要找到问题的原因。
文章来源: zmedu.blog.csdn.net,作者:互联网老辛,版权归原作者所有,如需转载,请联系作者。
原文链接:zmedu.blog.csdn.net/article/details/126327973
- 点赞
- 收藏
- 关注作者
评论(0)