【问题标题】:use grep in an if statement在 if 语句中使用 grep
【发布时间】:2015-09-28 18:35:34
【问题描述】:

我是 shell 脚本的初学者,需要一个脚本来检查进程的状态,并在启动时给我输出“正在运行”,在关闭时给我输出“未运行”。

我尝试了下面的一个,但它不起作用:

if [ -s `/opt/reds/recycle.sh status | grep "pid"` ];
then
    echo "running"
else
    echo "not running"
fi

有人可以帮帮我吗?

【问题讨论】:

  • if [ -s $(/opt/reds/recycle.sh status | grep "pid") ];
  • 传统上,-s 操作检查由以下参数命名的文件是否具有非零大小(不是空文件)。你想用-s做什么?

标签: shell if-statement grep


【解决方案1】:

将if 语句更改为:

if /opt/reds/recycle.sh status | grep "pid"
then
    ...
fi

您可能想要静默 grep:

-q 用于安静操作。
-s 用于抑制错误消息(此处不需要,因为grep 正在从stdin 获取输入)。

一般来说,用if检查命令的退出状态:

if command;then
   ...
fi

【讨论】:

  • 尽管您需要在grep 中添加一个-q 标志以避免将匹配项打印到标准输出。
  • @tripleee yap,还有一个 -s 选项可以抑制错误消息
  • 确实;虽然我很难想象你可以从阅读标准输入中得到什么样的错误信息,但我仍然想忽略它。如果机器内存不足或类似情况,您可能确实希望收到通知。
  • @tripleee 是的,对.. 在这种情况下不需要。
【解决方案2】:

如果recycle.sh 脚本完全正确执行,它应该设置其退出代码以指示状态。

如果是这种情况,您应该能够观察到它在状态正常时返回零(可能意味着服务正在运行),否则返回非零。

那么,你根本不需要grep。

if /opt/reds/recycle.sh status >/dev/null; then
    echo running
else
    echo not running
fi

正确编写的脚本还可能具有--query 选项或类似选项(--quiet、--silent、--script?),允许在此构造中使用它而无需重定向其输出。

【讨论】:

  • 谢谢。它起作用了:-) 但是,recycle.sh 有一些错误,因为输出中出现了一些不必要的行。如何在输出中仅获得“正在运行”或“未运行”?
  • 重定向到/dev/null 应该已经摆脱了任何正常输出。如果它还将虚假输出打印到标准错误,则需要将 2>&1 添加到重定向。
  • 我确实试过了。我得到同样的错误..“if /opt/reds/recycle.sh status 2>&1>/dev/null;”
  • 不,那是>/dev/null 2>&1;
  • 抱歉打扰你@tripleee.. 我也试过这个,但没有运气。当进程未运行时,recycle.sh 在输出中写入一些错误。这实际上很好。但是,在我的“查找状态”脚本的输出中看起来不太好。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多