从 Unix 脚本退出时 grep 命令出错

从 Unix 脚本退出时 grep 命令出错

我在运行脚本时创建了一个日志文件。

我想检查同一日志文件中是否有任何带有“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在本例中为),并且脚本将在发生致命错误时以非零退出状态终止。

关于您不引用变量扩展也可能相关:

相关内容