在unix脚本中打破嵌套的while循环

问题描述 投票:-2回答:2

有两个文件: 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

谢谢!

unix
2个回答
1
投票

您的问题的答案是使用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


0
投票

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个键,运行thenelse并退出循环。

并且,请确保您的关键词不能是最长词的子串,否则您将收到错误。

例:

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

现在你只计算了与你的键相等的单词,而不计算任何有用字符串中的子串。

© www.soinside.com 2019 - 2024. All rights reserved.