在unix脚本中中断嵌套的while循环
有两个文件:在unix脚本中中断嵌套的while循环,unix,Unix,有两个文件: 文件1包含关键字-INFO ERROR file2具有日志文件列表路径-路径1路径2 如果任何循环中的任何条件失败,我需要退出脚本 代码如下: #!/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 $li
文件1包含关键字-INFO ERROR
file2具有日志文件列表路径-路径1路径2
如果任何循环中的任何条件失败,我需要退出脚本 代码如下:
#!/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
#/bin/bash
RC=0
读行时
做
echo“从文件$行中进行grepping”
如果[-f$行];则
边读键
做
echo“从文件$line搜索$key”
如果[条件];然后
RC=0;
其他的
RC=1;
打破
fi
完成
谢谢大家! 用
$(grep-c${key}${line})-gt 0替换条件
,如下所示:
echo "searching $key from the file $line
if [ $(grep -c ${key} ${line}) -eq 0 ]; then
它将统计日志文件中的每个关键字。如果count=0(未找到模式),则运行,然后运行。如果找到至少一个键,则运行else
,RC=1
并退出循环
确保你的关键词不能是最长单词的子串,否则你会出错
例如:
[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
如果您希望避免计数2(因为计数第一个字符串的方式很糟糕,这是一种不好的方式),那么还应该为grep添加两个键:
[sahaquiel@sahaquiel-PC Stackoverflow]$ grep -cow ERROR file
1
现在,您只计算了与您的键相等的单词,而没有计算任何有用字符串中的子字符串。您的问题的答案是使用中断2
:
while true; do
sleep 1
echo "outer loop"
while true; do
echo "inner loop"
break 2
done
done
我从来没有使用过这个,当你想要理解或修改代码的时候,这是很糟糕的。
更好的方法是使用布尔值
found_master=
while [ -n "${found_master}" ]; do
sleep 1
echo "outer loop"
while true; do
echo "inner loop"
found_master=true
break
done
done
当您不需要找到主变量时,它是一个丑陋的附加变量。
你可以使用一个函数
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
内循环(){
局部i=0;
while((i++<5));do
((随机=$random%5))
回显“内部$i:${random}”
如果[${random}-eq 0];则
回显“返回0”
返回0
fi
完成;
返回1;
}
j=0
而((j++<5));做
回显“外循环$j”
内环
如果[$?-等式0];然后
回应“内心破碎”
打破
fi
完成
但是您的原始问题可以在没有两个while循环的情况下处理。
您可以使用grep-E“INFO | ERROR”文件2
或组合关键字。当关键字位于file1中的不同行时,可以使用grep-f file1 file2