有两个文件: file1有关键词 - INFO ERROR file2具有日志文件路径列表 - path1 path2 如果任何循环中的任何条件失败,我需要退出脚本。
这是代码:
#!/bin/bash
RC=0
while read line
do
echo "grepping from the file $line
if [ -f $line ]; then
while read key
do
echo "searching $key from the file $line
if [ condition ]; then
RC=0;
else
RC=1;
break;
fi
done < /apps/file1
else
RC=1;
break;
fi
done < apps/file2
exit $RC
谢谢!
您的问题的答案是使用qazxsw poi:
break 2
我从不使用它,当你想要理解或修改代码时,这很糟糕。已经更好的是使用布尔值
while true; do
sleep 1
echo "outer loop"
while true; do
echo "inner loop"
break 2
done
done
当你不需要变量found_master时,它是一个丑陋的附加变量。 你可以使用一个功能
found_master=
while [ -n "${found_master}" ]; do
sleep 1
echo "outer loop"
while true; do
echo "inner loop"
found_master=true
break
done
done
但是你的原始问题可以是没有两个while循环的句柄。您可以使用inner_loop() {
local i=0;
while ((i++ < 5)); do
((random=$RANDOM%5))
echo "Inner $i: ${random}"
if [ ${random} -eq 0 ]; then
echo "Returning 0"
return 0
fi
done;
return 1;
}
j=0
while ((j++ < 5 )); do
echo "Out loop $j"
inner_loop
if [ $? -eq 0 ]; then
echo "inner look broken"
break
fi
done
或组合关键字。当关键字位于file1中的不同行时,您可以使用grep -E "INFO|ERROR" file2
。
用grep -f file1 file2
替换condition
,如下所示:
$(grep -c ${key} ${line}) -gt 0
它将计算日志文件中的每个关键字。如果count = 0(未找到模式),则运行echo "searching $key from the file $line
if [ $(grep -c ${key} ${line}) -eq 0 ]; then
。如果找到至少1个键,运行then
,else
并退出循环。
并且,请确保您的关键词不能是最长词的子串,否则您将收到错误。
例:
RC=1
如果你想避免计数2(因为计算第一个字符串,不经意,坏方法),你还应该为grep添加两个键:
[sahaquiel@sahaquiel-PC Stackoverflow]$ cat file
correctstringERROR and more useless text
ERROR thats really error string
[sahaquiel@sahaquiel-PC Stackoverflow]$ grep -c ERROR file
2
现在你只计算了与你的键相等的单词,而不计算任何有用字符串中的子串。