如果模式与文件匹配,如何返回 0?

如果模式与文件匹配,如何返回 0?

我有一个重新打包 android 内核的二进制文件(不是 mkbootimg)。我正在制作一个脚本来自动化该过程。

我不想在屏幕上有任何输出。所以我将输出重定向到名为 foo.log 的文件。

命令是-kernel_make "$zImage" "$ramdisk" "$cmdline" "$image" &> data/local/working/foo.log

我当前的工作文件夹是data/local/working/.我要做的是,如果输出(foo.log)的最后一行是这样的 -

"targed file $1 is patched sucesfully, enjoy new kernel"

然后返回0并退出。否则返回 1 并退出。

我正在尝试使用 grep 进行操作,但由于我是命令行新手,因此不知道如何以正确的方式进行操作。

答案1

Grep 退出默认情况下,0匹配时和1不匹配时。因此你可以这样做:

grep -q "targed file \$1 is patched sucesfully, enjoy new kernel" foo.log

抑制-q任何输出。

要测试的话,请说:

grep -q "targed file \$1 is patched sucesfully, enjoy new kernel" foo.log && echo OK || echo BAD

如果$1实际替换为文件名,您可以替换\$1.*或 之类的内容\S\+

您可能还想考虑修复(检查):

targed     -> target
sucesfully -> successfully

正如评论中所述,这与整个文件匹配。tail按照@orion 的表述使用。

答案2

grep是要走的路,如果找到匹配则返回 0。您实际上不需要输出该行,因此只需丢弃该行并使用测试即可。在你的情况下,这只是

lastline=$(tail -n1 logfile)
if grep pattern <<<"$lastline" &>/dev/null; then
    echo "yay, found pattern"
else
    echo "darn"
fi

观察“here string”构造<<<,它将字符串呈现为要grep读取的文件,并&>重定向标准输出和错误输出(在本例中重定向为 null)。模式可以是“享受”或其他什么。用您的自定义处理替换回声。

kernel_make然而,如果失败的话,只检查是否返回 1 会更有意义。无需解析用户友好的日志输出(这可能会更改或不再是最后一条消息)。如果是这种情况(最有可能),我就会这样做

kernel_make [...arguments...] && echo "yay" || echo "nay"

(或 if 语句,如 grep 情况)。您可能熟悉在失败的情况下exit可能会在表单中使用的语句。exit 1

如果kernel_make是脚本的最后一行,你甚至不需要做任何事情......

相关内容