![从 Unix 脚本退出时 grep 命令出错](https://linux22.com/image/141100/%E4%BB%8E%20Unix%20%E8%84%9A%E6%9C%AC%E9%80%80%E5%87%BA%E6%97%B6%20grep%20%E5%91%BD%E4%BB%A4%E5%87%BA%E9%94%99.png)
我在运行脚本时创建了一个日志文件。
我想检查同一日志文件中是否有任何带有“Msg ....”的消息,并退出代码(除了“Msg 2714”)。
因此,我将以下代码添加到我的脚本中:
Some line of code before
rc1=`grep -v 'Msg 2714' $Logfilename`
rc2=`grep -i 'Msg' $rc1`
if [ $rc2 -ne "" ]
then
echo "Error message, some query has failed"
exit
fi
但是,我遇到了 grep 命令的问题,即使第二个 grep 返回 null,退出代码/返回代码为“1”,因此“如果命令失败并且脚本存在”。
如果这里有什么问题,请提供任何建议吗?
谢谢你!
答案1
您的脚本使用 的值$rc1
作为文件名,但这是 的输出grep
。
要将第一个的输出输入grep
另一个grep
,请使用管道:
grep -v ... filename | grep ...
不要保存 in 变量的结果grep
(可能会很大),而是让测试if
直接作用于运行此管道的结果:
if grep -v -F 'Msg 2714' "$Logfilename" | grep -q -F Msg; then
echo 'Error message, some query has failed' >&2
exit 1
fi
这使用管道的退出状态(这将是 的退出状态grep -q
)来确定脚本是否应输出错误消息并退出。不需要将数据存储在变量中。
grep -q
不会输出任何内容,但如果给定的模式匹配,则会成功退出。我还使用了-F
两次调用,grep
因为我们匹配字符串,而不是正则表达式。
我还遵循一般准则,即在标准错误流上生成错误消息(echo ... >&2
在本例中为),并且脚本将在发生致命错误时以非零退出状态终止。
关于您不引用变量扩展也可能相关: