Bash 函数while循环中如何处理返回?

Bash 函数while循环中如何处理返回?,bash,while-loop,return,Bash,While Loop,Return,我有一个函数,函数中有一个while循环 当我试图用IF语句在while循环中设置一个非局部变量,然后退出整个函数时,突然变量不再设置了 function EXAMPLE { cat test.txt | while read LINE; do if [ "$LINE" = "FAIL" ]; then echo "Detected FAIL in file! Setting RETURN=fail and exiting function." RETURN=

我有一个函数,函数中有一个while循环

当我试图用IF语句在while循环中设置一个非局部变量,然后退出整个函数时,突然变量不再设置了

function EXAMPLE {
  cat test.txt | while read LINE; do
    if [ "$LINE" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done
}

### START SCRIPT ###
EXAMPLE (Call example function)
echo "$RETURN"
由于某种原因,RETURN是空的。但我在过去做过很多次。while循环的某些内容阻止了从函数中传递返回。“return”是否导致脚本中断循环而不是函数


谢谢

当您在bash中使用管道时,管道中的所有命令都在子shell中执行。这意味着当子shell退出时,变量无法生存。在这种情况下,很容易拆除管道

function EXAMPLE {
  while read LINE; do
    if [ "$LINE" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done < text.txt
}
函数示例{
边读边做
如果[“$LINE”=“FAIL”];则
echo“在文件中检测到失败!设置RETURN=FAIL并退出函数。”
RETURN=“失败”
返回
fi
完成

我建议不要经常使用所有的CAPS:有一天,您将使用名为PATH的变量,然后必须找出命令停止工作的原因。

最简单的解决方案是首先避免使用子shell,使用输入重定向而不是管道

function EXAMPLE {
  while IFS= read -r line; do
    if [ "$line" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done < test.txt
}

something | otherthing
:在bash中,
otherthing
在子shell中运行。当它结束时,子shell退出。子shell中的任何creater或modified变量在父shell中都不可用,父shell中仍然有它们以前的值。因此,如何从while循环发回RETURN?相反,当它发现“FAIL”时使用“RETURN 1”,如果它在没有找到的情况下结束do..,则使用“RETURN 0”。然后调用它并使用它的返回值来决定发生了什么。谢谢你的帮助。得到下面的解决方案。我会用“return 1”而不是“return”[返回0,在许多上下文中通常表示“ok]。这样,当您发现“失败”时,您就可以区分返回1
和(诱导的)
返回0
,如果完成后没有发现“失败”,就会发生这种情况。谢谢,这也是正确的,但也有人打败了您。OMG终于感谢您了!!!!!!!!!!!!!!!!!!!!!!!这件事已经拖了两天了!你是个救生员。官方的解决方案相当复杂。这只是一个示例问题,但您的解决方案在概念上是完美的。非常感谢。我认为“whileread行”实际上应该是“whileread-r行”;而“没有“-r”会让你在输入不受控制的情况下表现出奇怪的行为。是的,我没有像过去在阅读
时那样小心。
function EXAMPLE {
  while IFS= read -r line; do
    if [ "$line" = "FAIL" ]; then
      echo "Detected FAIL in file! Exiting function with status 1."
      return 1
    fi
  done < test.txt
}