这是我的代码:
if grep -x $idle | grep -x $dead | grep -x $busy ./Event.log
then
echo " Events are running Successfully" >> ./Event.log
else
echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
我收到以下错误:
grep: 0652-033 Cannot open 1.
grep: 0652-033 Cannot open 0.
grep: 0652-033 Cannot open 0.
即使if
条件满足,它也会进入else
块。
谁可以帮我这个事?
答案1
命令grep
有两个参数:图案和文件。如果输入通过管道|
或重定向连接到标准输入,则可以省略该文件<
。在您的示例中,情况并非如此,因此第一个grep
不知道在哪里寻找模式。你需要这样写:
grep -x $idle Event.log | grep -x $dead | grep -x $busy
请注意,第二个和第三个grep
s 不需要文件参数,因为它们从管道读取。
然而,就你的情况而言,我猜你宁愿寻找三个替代字符串。因此,您可以使用|
带有grep -E
或\|
不带有 的替代运算符-E
,例如:
if grep -x "$idle\|$dead\|$busy" ./Event.log >/dev/null
then
echo " Events are running Successfully" >> ./Event.log
else
echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
答案2
您可能需要引用正则表达式(以避免 shell 分词规则),禁用选项(以避免正则表达式中的前导连字符被视为 的选项grep
),并正式指示正在对 stdin 进行 grep。
$ x="hi there"; (echo hi there; echo bye there) | grep -- "$x" -
hi there
如果您只需要测试条件的结果,-q
则选项grep
也可能相关。