我写了一个小的 bash 脚本。它会尝试找到这个词错误。如果找到,结果值将是非零数字(例如 25。我在脚本中提到,但它是可变数字值),如果没有找到,它将是 0。
我的问题是:我想使用case
语句,这样如果输出不为零,则执行以下命令
truncate -s 0 /root/test/wayfile.log && screen -X -S wowow quit &
脚本在这里:
#! /bin/bash
case "$(grep ERROR /root/test/wayfile.log | wc -w)" in
25) echo "empty log file and kill screen: $(date)" >> /var/log/finderror.txt
truncate -s 0 /root/test/wayfile.log && screen -X -S wowow quit &
;;
0) # all ok
;;
esac
答案1
一种选择:告诉case
寻找 a 0
,在这种情况下:什么也不做;否则,执行你的命令:
case X in
(0) : ## do nothing
;;
(*) truncate ...
;;
esac
另一种选择:告诉case
寻找任何非零数字:
case X in
([123456789]) truncate ...
esac
...但我不会尝试将数字与 匹配,而是case
使用test
:
if [ "$(grep -c ERROR /root/test/wayfile.log)" -gt 0 ]
then
truncate ...
fi
我已简化grep ... | wc -w
为 just grep -c
,它要求grep
进行计数而不是涉及wc
。
此外,既然你是真的ERROR
只是对文件中是否存在该单词感兴趣,您可以询问grep
它是否存在:
if grep -F -q ERROR /root/test/wayfile.log
then
truncate ...
fi
该-F
标志告诉 grep 我们的搜索文本是纯文本(“固定”)——没有正则表达式;该-q
标志告诉 grep 要“安静”——不计算或输出匹配行,只是根据是否找到(或没有)搜索文本来设置其退出状态。成功的退出代码(0)表示在文件中至少找到了一次搜索文本;失败表示在文件中根本没有找到搜索文本。