我有一个重新打包 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
是脚本的最后一行,你甚至不需要做任何事情......