Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在unix脚本中中断嵌套的while循环_Unix - Fatal编程技术网

在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