Bash 函数while循环中如何处理返回?
我有一个函数,函数中有一个while循环 当我试图用IF语句在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=
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
}